在与 Autofac 相同的范围内注入已经解析的实例(通过构造函数)?

好吧,我认为这是可能的,但不确定如何做到。这是我的场景:我有 2 个服务,一个依赖于另一个,如下所示:


public interface IServiceA {

    //...

}

public interface IServiceB {

    //...

}

//the actual implementation

public class ServiceA : IServiceA {

    //...

}

public class ServiceB : IServiceB {

    readonly IServiceA _serviceA;

    public ServiceB(IServiceA serviceA){

        _serviceA = serviceA;

    }

}

我有另一个类使用这两种服务:


public class MyConsumer {

    readonly IServiceA _serviceA;

    readonly IServiceB _serviceB;

    public MyConsumer(IServiceA serviceA, IServiceB serviceB){

        _serviceA = serviceA;

        _serviceB = serviceB;

    }

}

所以在这里我想serviceB用什么解决的注入serviceA在此构造这里的权利MyConsumer。(意味着serviceA注入的ServiceB应该正是serviceA注入的实例MyConsumer——而不是一些新的不同实例)。需要注意的是:我不希望暴露ServiceA通过ServiceB,也将让MyConsumer依赖于IServiceB唯一的(实际上ServiceA是基本服务,而其他服务,包括ServiceB只是延长,意味着可能会有更多的服务,如ServiceB在这种情况下)


我对 Autofac 真的很陌生,甚至使用 Unity(我用的最多)我以前从未想过这种情况,所以到目前为止我真的没有任何代码。


我希望这里有人以前遇到过同样的情况,可以给我一些建议,谢谢!


额外问题:如果参数(传入的MyConsumer构造函数)的顺序改变了怎么办?我的意思是这会影响解析顺序并导致意外结果吗?如果可能,参数顺序应该无关紧要(因为它MyConsumer应该只关心它需要什么,而不是它需要的东西是如何排序的)。


问题的大图:有些人建议在defined scope某些情况下使用autofac 支持的内容。但是我这里的场景不同,我认为强制 autofac 理解我想要的东西不是很方便。


在MyConsumer这里实际上可能永远不会被直接(使用解决.Resolve方法),因为它可能只是另一个类的依赖(这就是我们所说.Resolve的)。通过使用scope convention,我认为这是正确的方法,但在我的情况下,范围是不同的,我认为它是由类的构造函数自然定义的(注入的所有依赖项都应该在同一范围内 - 并且该范围内类型的每个实例都应该是一个单身人士 - 在他们之间共享)。不知道为什么 Autofac 可以为我们提供的内容中缺少这一点。


慕姐8265434
浏览 155回答 3
3回答

呼啦一阵风

这是一个与其他答案不同的解决方案,希望能解决您对容器特殊用途的担忧:namespace AutofacTest{&nbsp; &nbsp; public interface IServiceA { }&nbsp; &nbsp; public interface IServiceB { }&nbsp; &nbsp; public class ServiceA : IServiceA&nbsp; &nbsp; {&nbsp; &nbsp; }&nbsp; &nbsp; public class ServiceB : IServiceB&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; private readonly IServiceA _serviceA;&nbsp; &nbsp; &nbsp; &nbsp; public ServiceB (IServiceA serviceA)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _serviceA = serviceA;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; public class MyConsumer&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; private readonly IServiceA _serviceA;&nbsp; &nbsp; &nbsp; &nbsp; private readonly IServiceB _serviceB;&nbsp; &nbsp; &nbsp; &nbsp; public MyConsumer(Func<IServiceA> serviceAFactory, Func<IServiceA, IServiceB> serviceBFactory)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _serviceA = serviceAFactory();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _serviceB = serviceBFactory(_serviceA);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}在这个解决方案中,我注入工厂而不是实例,然后调用它们来获取实例。这个实现有点难看的一件事是参数顺序现在很重要。如果你真的不希望顺序很重要,你可以IServiceA在IServiceB接口上公开一个 setter ,然后用类似的东西替换构造函数public MyConsumer(Func<IServiceA> serviceAFactory, Func<IServiceB> serviceBFactory){&nbsp; &nbsp; _serviceA = serviceAFactory();&nbsp; &nbsp; _serviceB = serviceBFactory(_serviceA);&nbsp; &nbsp; _serviceB.SetServiceA(_serviceA);}
打开App,查看更多内容
随时随地看视频慕课网APP