将配置类的依赖注入到静态文档数据库存储库(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"));
// ...
}
// ...
}
我相信你就快成功了。
你要做的第一步差不多完成了。
在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
}
}