在依赖链中覆盖
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>();
我是 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>();