嵌套泛型和依赖关系注入 C#
本文关键字:注入 关系 依赖 泛型 嵌套 | 更新日期: 2023-09-27 18:30:49
我对依赖注入比较陌生。我想我明白了,但现在我遇到了这个问题。假设我有一些接口和一些类:
interface IA<T>
interface IB<IA<T>>
class A<T> : IA<T>
class B<IA<T>> : IB<IA<T>>
我想在我的依赖项注入容器中注册以下内容:
container.Register<IB<IA<T>>, B<A<T>>(...);
当我尝试解决IB<IA<T>>
时,它失败了,并出现异常,说明IB<IA<T>>
无法转换为B<A<T>>
。
为什么会失败,我该如何修复它?
就像阿列克谢已经发布的那样,您不会以这种方式使用泛型。你可能会想要这样的东西:
public interface IA<T>
{
T Item { get; }
}
public interface IB<T>
{
IA<T> IA { get; }
}
示例实现:
public class A<T> : IA<T>
{
public T Item
{
get;
set;
}
}
public class B<T> : IB<T>
{
public B(IA<T> ia)
{
this.IA = ia;
}
public IA<T> IA
{
get;
private set;
}
}
由于主题是依赖注入,因此 B 实现没有无参数构造函数。相反,它会在构造函数中通知其依赖项。
设置容器,首先注册 IA 实现:
container.Register<IA<int>, A<int>>(); // specific implementation or
container.Register(typeof(IA<>), typeof(A<>)); // generic registration
注册 IB 将是相同的,容器应该负责将依赖项注入到 B 类的构造函数:
container.Register<IB<int>, B<int>>();
container.Register(typeof(IB<>), typeof(B<>));
在运行时解析时,您需要指定类型:
var intIB = container.Resolve<IB<int>>();
var stringIB = container.Resolve<IB<string>>();