在依赖链中覆盖

Overriding in chain of dependencies

我是 Unity 新手。我有 3 个 类 这样的

ClassA(ClassB b)
ClassB(ClassC c)
public class ClassC
{
    public string Name { get; set; }
}

当运行时我有 classC.Name = "foo",我的问题是如何使用 classC 解析 <ClassA>?我是否应该创建工厂方法来首先使用 ClassC 解析 ClassB 然后使用 ClassB 解析 ClassA

有没有更好的方法?

据我了解,您有一些 class,比如 ClientClass,需要在给定 ClassC 的实例的情况下创建 ClassA 的实例。

例如:

public class ClientClass
{
    public void SomeMethod()
    {
        ClassC class_c = ...
        ClassA class_a = CreateClassA(class_c);
    }
}

所以这意味着 ClientClass 需要一个如下所示的依赖项:

public interface IClassAFactory
{
    ClassA Create(ClassC class_c);
}

这种依赖称为工厂,它允许您创建其他依赖。

现在,在您决定是否需要工厂之前,先看看没有工厂是否也能满足您的要求。看看 this article.

如果您决定需要一个工厂,请在需要它的同一个程序集中定义上述接口(ClientClass 所在的程序集)。

然后您需要创建此类工厂的实现,该工厂使用容器创建 ClassA 对象。

这样的工厂是这样的:

public class UnityBasedClassAFactory : IClassAFactory
{
    private readonly IUnityContainer m_Container;

    public UnityBasedClassAFactory(IUnityContainer container)
    {
        m_Container = container;
    }

    public ClassA Create(ClassC class_c)
    {
        return m_Container.Resolve<ClassA>(new DependencyOverride<ClassC>(class_c));
    }
}

请注意,此工厂 class 需要存在于 Composition Root. If you create it in any other place, this would mean that you are using the Service Locator anti-pattern

现在,您需要像这样将工厂接口注入 ClientClass

public class ClientClass
{
    private readonly IClassAFactory m_ClassAFactory;

    public ClientClass(IClassAFactory class_a_factory)
    {
        m_ClassAFactory = class_a_factory;
    }

    public void SomeMethod()
    {
        ClassC class_c = ...; //runtime value
        ClassA class_a = m_ClassAFactory.Create(class_c);
    }
}

现在,您需要做的就是像这样在 Composition Root 中注册工厂:

container.RegisterType<IClassAFactory, UnityBasedClassAFactory>();