我的课程如下-
public class GCCUPCCodeGenerator : IUPCCodeGenerator
{
IPersistence _persistence;
string _gccPrefix;
public GCCUPCCodeGenerator(IPersistence persistence , string gccPrefix)
{
_persistence = persistence;
}
如何在Startup.cs中为此对象完成依赖项注入?
这就是我所知道的-
A。。如果此类仅需要IPersistence类,我会添加-
services.AddScoped<IPersistence, Persistence>();
B。最后,如果这是构造函数中具有简单类型的类,那么我知道如何从Config读取值以创建对象。
对于UnixConnection类-
public class UnixConnection : IUnixDataStore
{
public UnixConnection(UnixConnectionOption connectionOptions)
{
Startup.cs-
services.AddScoped<IUnixDataStore>(provider => ConfigureUnixConnectionObject());
IUnixDataStore ConfigureUnixConnectionObject()
{
var connectionParam = new UnixConnectionOption
{
DBPort = Convert.ToInt32(Configuration["DBPort"]),
SSHUserName = Configuration["SSHUserName"],
SSHHostName = Configuration["SSHHostName"],
SSHPassword = Configuration["SSHPassword"],
SQLHostName = Configuration["SQLHostName"],
SQLUserName = Configuration["SQLUserName"],
SQLPassword = Configuration["SQLPassword"],
SQLDatabaseName = Configuration["SQLDatabaseName"]
};
return new UnixConnection(connectionParam);
}
答案 0 :(得分:1)
您必须使用提供者操作重载,这与第二种情况非常相似(具有讽刺意味的是, 不需要它来完成此工作)。
services.AddScoped<IUPCCodeGenerator>(p =>
{
// `p` is a scoped instance of `IServiceProvider`, meaning you can pull services from it
var persistence = p.GetRequiredService<IPersistence>();
return new GCCUPCCodeGenerator(persistence, "prefix");
});
前缀当然可以来自您的配置。
与您的问题无关,但是由于我提到您不需要为IUnixDataStore
执行此操作。如果您的配置使用了节(应该这样做,因为在根目录中有一堆不相关的配置设置会导致混乱和错误),那么您可以通过强类型的配置将节绑定到UnixConnectionOptions
。假设配置如下:
{
"UnixConnection": {
"DBPort": "...",
"SSHUserName": "...",
...
}
}
(注意:如果使用类似环境变量的东西,则可以使用:
,即UnixConnection:DBPort
来“剖分”)
然后:
services.Configure<UnixConnectionOption>(Configuration.GetSection("UnixConnection"));
在那之后,您有几种选择。如果您不介意注入IOptions<UnixConnectionOption>
或IOptionsSnapshot<UnixConnectionOption>
,那么您就完成了。实际上,这很有用,因为您可以利用config reload之类的优势。
如果您真的想直接注入UnixConnectionOptions
,则只需添加另一行,如:
services.AddScoped<UnixConnectionOptions>(p =>
p.GetRequiredService<IOptions<UnixConnectionOptions>>().Value);
services.AddScoped<IUnixDataStore, UnixConnection>();
由于所需的依赖关系直接存在于服务集合中,因此可以直接注入而无需提供自定义操作。或者,您可以坚持目前的做法,但至少要利用减少的代码:
services.AddScoped<IUnixDataStore>(p => {
var connectionParam = p.GetRequiredService<IOptions<UnixConnectionOption>>();
return new UnixConnection(connectionParam.Value);
);