依赖注入,带有自定义和简单对象的构造函数

时间:2019-02-18 20:00:14

标签: c# asp.net-core dependency-injection

我的课程如下-

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

1 个答案:

答案 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);
);