C# 依赖链中的重写
我不熟悉团结。我有三节课像这样C# 依赖链中的重写,c#,dependency-injection,unity-container,C#,Dependency Injection,Unity Container,我不熟悉团结。我有三节课像这样 ClassA(ClassB b) ClassB(ClassC c) public class ClassC { public string Name { get; set; } } 当我有classC.Name=“foo”时,我的问题是如何使用classC解决?我是否应该先使用ClassC创建工厂方法来解析ClassB,然后使用ClassB解析ClassA 有更好的方法吗?据我所知,您有一些类,比如说ClientClass,需要在给定ClassC的实例的
ClassA(ClassB b)
ClassB(ClassC c)
public class ClassC
{
public string Name { get; set; }
}
当我有classC.Name=“foo”
时,我的问题是如何使用classC
解决
?我是否应该先使用ClassC
创建工厂方法来解析ClassB
,然后使用ClassB
解析ClassA
有更好的方法吗?据我所知,您有一些类,比如说
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);
}
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);
}
}
container.RegisterType<IClassAFactory, UnityBasedClassAFactory>();
此依赖项称为工厂,它允许您创建其他依赖项
现在,在你决定你需要一个工厂之前,看看你是否能在没有工厂的情况下满足你的要求。看一看
如果决定使用工厂,请在需要它的同一程序集中定义上述接口(其中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));
}
}
现在,您需要做的就是在合成根目录中注册工厂,如下所示:
public interface IClassAFactory
{
ClassA Create(ClassC class_c);
}
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);
}
}
container.RegisterType<IClassAFactory, UnityBasedClassAFactory>();
container.RegisterType();
你能解释一下当运行时我有classC时你所说的是什么意思吗。Name=“foo”
?我的意思是当运行时我有一个classC对象,例如,它是从列表中选择的。感谢链接,实际上这一个解决了我的问题新的DependencyOverride(class_c)
不知道它可以覆盖链中的参数。嗨,Yacoub,我现在得到另一个需要工厂的案例,我将应用您的解决方案,但我的问题是:将容器传递给UnityBasedClassSafFactory是否正确?@kvuong,只要工厂位于合成根目录中。