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

本文关键字:存储 VS2015 DNX 项目 文档数据库 静态 配置 依赖 注入 | 更新日期: 2023-09-27 18:08:57

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

在我的API层我有配置。特定于环境的Json文件。我想使用依赖注入,以便能够使用我的配置类,读取更深的基础设施层中API层中定义的DocumentDB设置。这个StackOverflow回答详细说明了如何使用DI与API控制器,但是我不知道如何在这种情况下使用DI,作为一个静态类,我没有构造函数。是否可以在静态存储库中使用DI ?如果没有,我应该如何读取配置设置到基础设施层?

我的ConfigurationOptions类(在基础设施层):

public class ConfigurationOptions
{
    public string EndpointUri { get; set; }
}

我的DocumentDbRepository类(在基础设施层):

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();
    }
}

我的Startup类的一部分(在我的API层)

public class Startup
{
    public IConfiguration Configuration { get; set; }
    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<ConfigurationOptions>(options =>
            options.EndpointUri = Configuration.Get("EndpointUri"));
    // ...
    }
// ...
}

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

我相信你就快成功了。

你要做的第一步差不多完成了。

在startup。cs中,有

services.Configure<ConfigurationOptions>(options =>
        options.EndpointUri = Configuration.Get("EndpointUri"));

你可以调用

services.Configure<ConfigurationOptions>(Configuration);

服务将映射类的EndpointUri属性。第一步完成了。

现在,按照你链接的帖子,你可以发送你的configurationOptions到控制器,如:

    public class SomeController
{
    private string _endpointUrl;
    public SomeController(IOptions<ConfigurationOptions> options)
    {
        _endpointUrl = options.Options.EndpointUri;
    }
}

但是,根据我的假设,您希望在documentdbrerepository中拥有EndpointUri。有两种方法:

--------------------------------------------------

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

    public class SomeController
{
    private DocumentDbRepository _documentDbRepositoy
    public SomeController(IOptions<ConfigurationOptions> options)
    {
        _documentDbRepositoy = new DocumentDbRepository (options.Options.EndpointUri);
    }
}

2 ---------------------------------------------------

你可以把DocumentDbRepository注入到你所有的控制器中。为此,我建议您创建一个接口idocumentdbrerepository,然后在启动时配置它,使其成为单例或作用域或跨例(有关更多信息,请参阅此链接)

要做到这一点,让我们从DocumentDbRepository 开始
public static class DocumentDbRepository<T> : IDocumentDbRepository<T>
{
    private string EndpointUri { get; private set;}
    public DocumentDbRepository(IOptions<ConfigurationOptions> options){
        EndpointUri = options.Options.EndpointUri;
    }
    //...

}

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

public void ConfigureServices(IServiceCollection services){
    services.Configure<ConfigurationOptions(Configuration);
    services.AddSingleton<IDocumentDbRepository, DocumentDbRepository>();
    // ...
}

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

    public class SomeController
{
    private DocumentDbRepository _documentDbRepositoy
    public SomeController(IDocumentDbRepository documentDbRepository)
    {
        _documentDbRepositoy = documentDbRepository
    }
}