我正在创建一个需要一些配置参数和记录器的服务。下面是我的服务的构造函数:
public StorageProvider(string directory, ILogger<StorageProvider> logger)我刚加了记录器。我过去常常在我的startup.cs中像这样将它初始化:
services.AddSingleton<IStorageProvider>(
new StorageProvider(Configuration["TempStorage.Path"]));directory参数来自配置文件,记录器得到DI‘’ed。如何设置我的IStorageProvider
发布于 2017-10-24 07:06:36
你应该做以下几点:
TempStorage:Path包装到自己的配置类中,例如StorageProviderSettings。StorageProvider依赖于这个新的配置类。示例:
public sealed class StorageProviderSettings
{
public readonly string TempStoragePath;
public StorageProviderSettings(string tempStoragePath)
{
if (string.IsNullOrWhiteSpace(tempStoragePath))
throw new ArgumentException(nameof(tempStoragePath));
this.TempStoragePath = tempStoragePath;
}
}
public sealed class StorageProvider : IStorageProvider
{
public StorageProvider(
StorageProviderSettings settings, ILogger<StorageProvider> logger)
{
// ...
}
}
// Registration
services.AddSingleton(new StorageProviderSettings(Configuration["TempStorage.Path"]));
services.AddSingleton<IStorageProvider, StorageProvider>();发布于 2017-10-24 00:53:53
正如Tratcher在评论中所建议的那样,使用Options模式。阅读官方配置文档中的更多内容。
基本上,您可以定义一个类来保存所需的值:
public class StorageProviderOptions
{
public string TempStoragePath { get; set; }
}然后在ConfigureServices中注册以下类型:
services.Configure<StorageProviderOptions>();在代码中,您请求IOptions<StorageProviderOptions>并将其设置为StorageProviderOptions的一个实例。
public class SomeController
{
private readonly StorageProviderOptions _options;
public SomeController(IOptions<StorageProviderOptions> options)
{
_options = options.Value;
}
}最后,确保配置源中有一个与TempStoragePath名称匹配的元素。或者,您可以使用代码在ConfigureServices中注册该选项:
services.Configure<ServiceProviderOptions>(o => o.TempStoragePath = "temp");https://stackoverflow.com/questions/46896695
复制相似问题