首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >构造函数具有非DI和DI参数。

构造函数具有非DI和DI参数。
EN

Stack Overflow用户
提问于 2017-10-23 19:03:24
回答 2查看 899关注 0票数 1

我正在创建一个需要一些配置参数和记录器的服务。下面是我的服务的构造函数:

代码语言:javascript
复制
public StorageProvider(string directory, ILogger<StorageProvider> logger)

我刚加了记录器。我过去常常在我的startup.cs中像这样将它初始化:

代码语言:javascript
复制
services.AddSingleton<IStorageProvider>(
    new StorageProvider(Configuration["TempStorage.Path"]));

directory参数来自配置文件,记录器得到DI‘’ed。如何设置我的IStorageProvider

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-24 07:06:36

你应该做以下几点:

  • 将配置值TempStorage:Path包装到自己的配置类中,例如StorageProviderSettings
  • StorageProvider依赖于这个新的配置类。
  • 将该配置类注册为单例ASP.NET配置系统。

示例:

代码语言:javascript
复制
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>();
票数 2
EN

Stack Overflow用户

发布于 2017-10-24 00:53:53

正如Tratcher在评论中所建议的那样,使用Options模式。阅读官方配置文档中的更多内容。

基本上,您可以定义一个类来保存所需的值:

代码语言:javascript
复制
public class StorageProviderOptions
{
    public string TempStoragePath { get; set; }
}

然后在ConfigureServices中注册以下类型:

代码语言:javascript
复制
services.Configure<StorageProviderOptions>();

在代码中,您请求IOptions<StorageProviderOptions>并将其设置为StorageProviderOptions的一个实例。

代码语言:javascript
复制
public class SomeController
{
    private readonly StorageProviderOptions _options;

    public SomeController(IOptions<StorageProviderOptions> options)
    {
        _options = options.Value;
    }
}

最后,确保配置源中有一个与TempStoragePath名称匹配的元素。或者,您可以使用代码在ConfigureServices中注册该选项:

代码语言:javascript
复制
services.Configure<ServiceProviderOptions>(o => o.TempStoragePath = "temp");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46896695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档