嵌套泛型和依赖关系注入 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>>

为什么会失败,我该如何修复它?

嵌套泛型和依赖关系注入 C#

就像阿列克谢已经发布的那样,您不会以这种方式使用泛型。你可能会想要这样的东西:

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