我有一个需要连接字符串作为其构造函数参数的类:
public class MyClassHere
{
private string connectionString;
public MyClassHere(string connectionString)
{
this.connectionString = connectionString;
}
}
我已将该类作为单例添加到我的服务中,如下所示:
services.AddSingleton<MyClassHere>();
显然这不起作用,因为它在构造函数中使用了一个字符串。
我看过这样的例子:
services.AddSingleton<MyClassHere>(new MyClassHere("Some Connnection String"));
但是我也读过一些模糊的话,当您这样做时,依赖项注入系统不会为您清理对象。
将实例传递到依赖项注入系统中(而不是仅仅让它为您创建)有什么弊端?
这样做的一个缺点是,如果要更改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();
}
哪个输出“条”如预期。