Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.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# 如何使用Autofac创建相互依赖的零部件_C#_Autofac - Fatal编程技术网

C# 如何使用Autofac创建相互依赖的零部件

C# 如何使用Autofac创建相互依赖的零部件,c#,autofac,C#,Autofac,我有两个相互依赖的类,我希望Autofac实例化它们。基本上,父级需要对子级的引用,子级需要对父级碰巧实现的服务的引用 public class Parent : ISomeService { private IChild m_child; public Parent(IChild child) { m_child = child; // problem: need to pass "this" to child constructor } }

我有两个相互依赖的类,我希望Autofac实例化它们。基本上,父级需要对子级的引用,子级需要对父级碰巧实现的服务的引用

public class Parent : ISomeService
{
    private IChild m_child;

    public Parent(IChild child)
    {
        m_child = child; // problem: need to pass "this" to child constructor
    }
}

public class Child : IChild
{
    public Child(ISomeService someService)
    {
        // ...store and/or use the service...
    }
}

有什么想法吗?

我找到了一个相当优雅的解决方案,使用。它允许使用现有对象(父实例)解决孩子对
ISomeService
的依赖关系,而不会引入任何混乱的生存期问题(据我所知):

公共类父类:ISomeService
{
私人一号m_child;
公共父级(Func子工厂)
{
m_child=儿童工厂(本);
}
}
公班儿童:IChild
{
公共儿童服务(儿童服务)
{
//…存储和/或使用服务。。。
}
}
//注册情况如下所示:
builder.RegisterType();//注册为自助服务,而不是自助服务
builder.RegisterType().AsImplementedInterfaces();

工作起来很有魅力。:)

我发现了一个相当优雅的解决方案。它允许使用现有对象(父实例)解决孩子对
ISomeService
的依赖关系,而不会引入任何混乱的生存期问题(据我所知):

公共类父类:ISomeService
{
私人一号m_child;
公共父级(Func子工厂)
{
m_child=儿童工厂(本);
}
}
公班儿童:IChild
{
公共儿童服务(儿童服务)
{
//…存储和/或使用服务。。。
}
}
//注册情况如下所示:
builder.RegisterType();//注册为自助服务,而不是自助服务
builder.RegisterType().AsImplementedInterfaces();

工作起来很有魅力。:)

您应该真正避免循环依赖。在您的情况下,一种解决方案是将
父类
分为两个不同的类class@CyrilDurand,您能否详细说明您在循环依赖关系中遇到的具体问题?对象图中有循环是很常见的,所以很难避免。这更多的是设计问题,而不是具体的技术问题。它通常表示一个设计问题,表明您的组件不可用。引入循环依赖关系的变通方法也会降低代码的可读性,并且测试模型将更加困难。还讨论一些循环依赖的问题。如果可能的话,尝试通过引入新组件等来避免这些依赖。你应该真正避免循环依赖。在您的情况下,一种解决方案是将
父类
分为两个不同的类class@CyrilDurand,您能否详细说明您在循环依赖关系中遇到的具体问题?对象图中有循环是很常见的,所以很难避免。这更多的是设计问题,而不是具体的技术问题。它通常表示一个设计问题,表明您的组件不可用。引入循环依赖关系的变通方法也会降低代码的可读性,并且测试模型将更加困难。还讨论一些循环依赖的问题。如果可能的话,尝试通过引入新组件等来避免这些依赖。
public class Parent : ISomeService
{
    private IChild m_child;

    public Parent(Func<ISomeService, IChild> childFactory)
    {
        m_child = childFactory(this);
    }
}

public class Child : IChild
{
    public Child(ISomeService someService)
    {
        // ...store and/or use the service...
    }
}

// Registration looks like this:

builder.RegisterType<Parent>(); // registered as self, NOT as ISomeService
builder.RegisterType<Child>().AsImplementedInterfaces();