将实例传递给ASP.NET Core依赖注入的缺点

问题描述 投票:0回答:1

我有一个需要连接字符串作为其构造函数参数的类:

public class MyClassHere
{
     private string connectionString;

     public MyClassHere(string connectionString)
     {
        this.connectionString = connectionString;
     }
}

我已将该类作为单例添加到我的服务中,如下所示:

services.AddSingleton<MyClassHere>();

显然这不起作用,因为它在构造函数中使用了一个字符串。

我看过这样的例子:

services.AddSingleton<MyClassHere>(new MyClassHere("Some Connnection String"));

但是我也读过一些模糊的话,当您这样做时,依赖项注入系统不会为您清理对象。

将实例传递到依赖项注入系统中(而不是仅仅让它为您创建)有什么弊端?

c# asp.net-core .net-core dependency-injection
1个回答
0
投票

这样做的一个缺点是,如果要更改MyClassHere的构造函数,则必须在DI注册中更新其用法。视使用方式而定,可能不重要。

无论如何,在.NET Core中处理这种情况并保持依赖项注入的所有好处的一种方法是使用Options pattern


这是给定您的示例的外观:

public class MyOptions
{
    public string ConnectionString { get; set; }
}

public class MyClassHere
{
    private readonly string _connectionString;

    public MyClassHere(IOptions<MyOptions> options)
    {
        _connectionString = options.Value.ConnectionString;
    }

    public void Foo() => Console.WriteLine(_connectionString);
}

这是注册的示例:

static void Main(string[] args)
{
    var myClass = new ServiceCollection()
        .Configure<MyOptions>(o =>
        {
            o.ConnectionString = "bar";
        })
        .AddSingleton<MyClassHere>()
        .BuildServiceProvider()
        .GetService<MyClassHere>();

    myClass.Foo();

    Console.ReadLine();
}

哪个输出“条”如预期。

© www.soinside.com 2019 - 2024. All rights reserved.