我在解决方案的基础结构层中有一个基本文档DB存储库。我基于这个GitHub项目建立这个存储库,这是一个静态类,其他域模型存储库都使用它。
在我的API层中,我有特定于环境的config.json文件。我想使用依赖注入来使用我的配置类来读取在更深层次的基础设施层中定义的DocumentDB设置。这个StackOverflow的答案详细介绍了如何在API控制器中使用DI,但是在这种情况下,我不知道如何使用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();
}
}
是我的启动类的一部分(在API层中)
public class Startup
{
public IConfiguration Configuration { get; set; }
public void ConfigureServices(IServiceCollection services)
{
services.Configure<ConfigurationOptions>(options =>
options.EndpointUri = Configuration.Get("EndpointUri"));
// ...
}
// ...
}
发布于 2015-08-20 10:19:06
我相信你快到了。
你必须采取的第一步就快完成了。
在你的startup.cs里
services.Configure<ConfigurationOptions>(options =>
options.EndpointUri = Configuration.Get("EndpointUri"));
你可以直接打电话
services.Configure<ConfigurationOptions>(Configuration);
服务将映射类的EndpointUri属性。这样,第1步就完成了。
现在,在链接的帖子之后,您可以将configurationOptions发送到控制器,如下所示:
public class SomeController
{
private string _endpointUrl;
public SomeController(IOptions<ConfigurationOptions> options)
{
_endpointUrl = options.Options.EndpointUri;
}
}
但是,根据我的假设,您希望EndpointUri在DocumentDbRepository中。你可以通过两种方式做到这一点:
1
您可以在DocumentDbRepository中创建一个构造函数来接收EndpointUri并在控制器中调用它,如下所示:
public class SomeController
{
private DocumentDbRepository _documentDbRepositoy
public SomeController(IOptions<ConfigurationOptions> options)
{
_documentDbRepositoy = new DocumentDbRepository (options.Options.EndpointUri);
}
}
2 2
您可以将DocumentDbRepository注入到所有控制器。为此,我建议您创建一个接口IDocumentDbRepository,然后在启动时对其进行配置,使其成为单例、范围或trasiend (有关更多信息,请参见此链接)
为此,让我们从您的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>();
// ...
}
通过这样做,如果控制器依赖于IDocumentDbRepository,则将提供单例:
public class SomeController
{
private DocumentDbRepository _documentDbRepositoy
public SomeController(IDocumentDbRepository documentDbRepository)
{
_documentDbRepositoy = documentDbRepository
}
}
https://stackoverflow.com/questions/32114267
复制相似问题