我正在尝试使用依赖项注入来添加一个具有构造函数参数的通用服务。我需要实现这个,一般来说:
host.Services.AddSingleton<IService>(x =>
new Service(x.GetRequiredService<IOtherService>(),
x.GetRequiredService<IAnotherOne>(),
""));
这就是我所使用的开放泛型:
host.Services.AddSingleton(typeof(IGenericClass<>), typeof(GenericClass<>));
我还不能用opengeneric添加构造函数参数。这是我想添加的类DI:
public class GenericClass<T> : IGenericClass<T> where T : class, new()
{
private readonly string _connectionString;
private readonly IGenericClass2<T> _anotherGenericInterface;
private readonly IInterface _anotherInterface;
public GenericClass(
string connectionString,
IGenericClass2<T> anotherGenericInterface,
IInterface anotherInterface)
{
_connectionString = connectionString ??
throw new ArgumentNullException(nameof(connectionString));
_executer = anotherGenericInterface;
_sproc = anotherInterface;
}
}
使用MS.DI,不可能像使用IService
注册那样使用工厂方法构造开放的通用注册。
这里的解决方案是将所有基元构造函数值封装到ParameterObject中,这样DI容器也可以解析它。例如:
// Parameter Object that wraps the primitive constructor arguments
public class GenericClassSettings
{
public readonly string ConnectionString;
public GenericClassSettings(string connectionString)
{
this.ConnectionString =
connectionString ?? throw new ArgumentNullExcpetion();
}
}
GenericClass<T>
的构造函数现在可以依赖于新的参数对象:
public GenericClass(
GenericClassSettings settings,
IGenericClass2<T> anotherGenericInterface,
IInterface anotherInterface)
{
_connectionString = settings.ConnectionString;
_executer = anotherGenericInterface;
_sproc = anotherInterface;
}
这允许您注册新的参数对象和打开的泛型类:
host.Services.AddSingleton(new GenericClassSettings("my connection string"));
host.Services.AddSingleton(typeof(IGenericClass<>), typeof(GenericClass<>));
不能使用Microsoft DI将参数传递给构造函数。但工厂的方法允许这样做。如果你想将类型字符串作为参数传递给这个构造函数,你需要将字符串注册为服务,但这个操作可能会导致很多错误,因为很多服务都有构造函数字符串参数。所以我建议您使用Options模式来传递一个像连接字符串一样的参数。