更改依赖链中的最低级别

本文关键字:依赖 | 更新日期: 2023-09-27 18:14:50

在我的项目中,我有5个类:

  • ClassA(实现接口IClassA),接受IClassC作为构造函数的参数
  • ClassB(实现接口IClassB),接受IClassC作为构造函数的参数
  • ClassC(实现接口IClassC),接受IClassD作为构造函数的参数
  • ClassD1ClassD2(均实现接口IClassD)

我的Unity容器的配置如下:

    container.RegisterType<IClassA, ClassA>(new HierarchicalLifetimeManager());
    container.RegisterType<IClassB, ClassB>(new HierarchicalLifetimeManager());
    container.RegisterType<IClassC, ClassC>(new HierarchicalLifetimeManager());
    container.RegisterType<IClassD, ClassD1>(nameof(ClassD1), new HierarchicalLifetimeManager());
    container.RegisterType<IClassD, ClassD2>(nameof(ClassD2), new HierarchicalLifetimeManager());

我想配置我的项目,即:

  • iclass 正在使用ClassC,而ClassC正在使用ClassD1
  • IClassB正在使用ClassC,后者正在使用ClassD2

我猜我应该在注册IClassAIClassB时改变一些东西。我想避免更改 iclass 注册。

这可能吗?

更改依赖链中的最低级别

我不知道你想这样做的确切原因,但在工厂的帮助下这是可能的。

虽然它可以工作,但我可能会检查设计和环境,因为它很复杂,它会让开发人员感到困惑(它有味道)。

class Program
{
    static void Main(string[] args)
    {
        IUnityContainer container = new UnityContainer();
        container.RegisterType<IClassC, ClassC>();
        container.RegisterType<IClassD, ClassD1>(nameof(ClassD1), new HierarchicalLifetimeManager());
        container.RegisterType<IClassD, ClassD2>(nameof(ClassD2), new HierarchicalLifetimeManager());
        container.RegisterType<IClassA, ClassA>(new InjectionConstructor(Factory.GetClassC<ClassD1>(container)));
        container.RegisterType<IClassB, ClassB>(new InjectionConstructor(Factory.GetClassC<ClassD2>(container)));
        var classA = container.Resolve<IClassA>();
        var classB = container.Resolve<IClassB>();
        classA.HelloFromA();
        classB.HelloFromB();
    }
}
public class Factory
{
    public static IClassC GetClassC<TClassD>(IUnityContainer container)
        where TClassD : IClassD
    {
        return container.Resolve<IClassC>(new DependencyOverride<IClassD>(
            container.Resolve<IClassD>(typeof(TClassD).Name)));
    }
}
public interface IClassA
{
    void HelloFromA();
}
public interface IClassB
{
    void HelloFromB();
}
public interface IClassC
{
    void HelloFromC();
}
public interface IClassD { }
public class ClassA : IClassA
{
    private readonly IClassC _classC;
    public ClassA(IClassC classC)
    {
        _classC = classC;
    }
    public void HelloFromA()
    {
        _classC.HelloFromC();
    }
}
public class ClassB : IClassB
{
    private readonly IClassC _classC;
    public ClassB(IClassC classC)
    {
        _classC = classC;
    }
    public void HelloFromB()
    {
        _classC.HelloFromC();
    }
}
public class ClassC : IClassC
{
    private readonly IClassD _classD;
    public ClassC(IClassD classD)
    {
        _classD = classD;
    }
    public void HelloFromC()
    {
        Console.WriteLine(string.Format("Hello with {0}", _classD.GetType().Name));
    }
}
public class ClassD1 : IClassD
{
}
public class ClassD2 : IClassD
{
}

注意事项:

  1. 注意注册顺序。a类和b类在最后注册,
  2. HierarchicalLifetimeManager不能在这个实例中使用,因为你需要同一个类的两个不同实例。

考虑阅读这篇文章:http://sharpfellows.com/post/Unity-IoC-Container-