首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将配置类的依赖项注入静态文档DB存储库(VS2015 DNX项目)

将配置类的依赖项注入静态文档DB存储库(VS2015 DNX项目)
EN

Stack Overflow用户
提问于 2015-08-20 09:17:55
回答 1查看 1.1K关注 0票数 1

我在解决方案的基础结构层中有一个基本文档DB存储库。我基于这个GitHub项目建立这个存储库,这是一个静态类,其他域模型存储库都使用它。

在我的API层中,我有特定于环境的config.json文件。我想使用依赖注入来使用我的配置类来读取在更深层次的基础设施层中定义的DocumentDB设置。这个StackOverflow的答案详细介绍了如何在API控制器中使用DI,但是在这种情况下,我不知道如何使用DI,作为一个静态类,我没有构造函数。可以在我的静态存储库中使用DI吗?如果没有,我应该如何将配置设置读入基础结构层?

我的ConfigurationOptions类(在基础结构层中):

代码语言:javascript
运行
复制
public class ConfigurationOptions
{
    public string EndpointUri { get; set; }
}

我的DocumentDbRepository类(在基础结构层中):

代码语言:javascript
运行
复制
public static class DocumentDbRepository<T>
{
    // I want to read these strings from my config.json files
    private static string EndpointUri { get; } = ConfigurationOptions.EndpointUri;

    //...


    private static Document GetDocument(string id)
    {
        return Client.CreateDocumentQuery(Collection.DocumentsLink)
            .Where(d => d.Id == id)
            .AsEnumerable()
            .FirstOrDefault();
    }
}

是我的启动类的一部分(在API层中)

代码语言:javascript
运行
复制
public class Startup
{
    public IConfiguration Configuration { get; set; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<ConfigurationOptions>(options =>
            options.EndpointUri = Configuration.Get("EndpointUri"));

    // ...

    }

// ...

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-20 10:19:06

我相信你快到了。

你必须采取的第一步就快完成了。

在你的startup.cs里

代码语言:javascript
运行
复制
services.Configure<ConfigurationOptions>(options =>
        options.EndpointUri = Configuration.Get("EndpointUri"));

你可以直接打电话

代码语言:javascript
运行
复制
services.Configure<ConfigurationOptions>(Configuration);

服务将映射类的EndpointUri属性。这样,第1步就完成了。

现在,在链接的帖子之后,您可以将configurationOptions发送到控制器,如下所示:

代码语言:javascript
运行
复制
    public class SomeController
{
    private string _endpointUrl;
    public SomeController(IOptions<ConfigurationOptions> options)
    {
        _endpointUrl = options.Options.EndpointUri;
    }
}

但是,根据我的假设,您希望EndpointUri在DocumentDbRepository中。你可以通过两种方式做到这一点:

1

您可以在DocumentDbRepository中创建一个构造函数来接收EndpointUri并在控制器中调用它,如下所示:

代码语言:javascript
运行
复制
    public class SomeController
{
    private DocumentDbRepository _documentDbRepositoy
    public SomeController(IOptions<ConfigurationOptions> options)
    {
        _documentDbRepositoy = new DocumentDbRepository (options.Options.EndpointUri);
    }
}

2 2

您可以将DocumentDbRepository注入到所有控制器。为此,我建议您创建一个接口IDocumentDbRepository,然后在启动时对其进行配置,使其成为单例、范围或trasiend (有关更多信息,请参见此链接)

为此,让我们从您的DocumentDbRepository开始

代码语言:javascript
运行
复制
public static class DocumentDbRepository<T> : IDocumentDbRepository<T>
{
    private string EndpointUri { get; private set;}

    public DocumentDbRepository(IOptions<ConfigurationOptions> options){
        EndpointUri = options.Options.EndpointUri;
    }

    //...


}

然后,在startup.cs将其设置为单例(在本例中)

代码语言:javascript
运行
复制
public void ConfigureServices(IServiceCollection services){
    services.Configure<ConfigurationOptions(Configuration);
    services.AddSingleton<IDocumentDbRepository, DocumentDbRepository>();
    // ...

}

通过这样做,如果控制器依赖于IDocumentDbRepository,则将提供单例:

代码语言:javascript
运行
复制
    public class SomeController
{
    private DocumentDbRepository _documentDbRepositoy
    public SomeController(IDocumentDbRepository documentDbRepository)
    {
        _documentDbRepositoy = documentDbRepository
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32114267

复制
相关文章

相似问题

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