Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 依赖链中的重写_C#_Dependency Injection_Unity Container - Fatal编程技术网

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,只要工厂位于合成根目录中。