为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕姐8265434 2021-06-22 09:15:03
好吧,我认为这是可能的,但不确定如何做到。这是我的场景:我有 2 个服务,一个依赖于另一个,如下所示:public interface IServiceA {    //...}public interface IServiceB {    //...}//the actual implementationpublic 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 可以为我们提供的内容中缺少这一点。
查看完整描述

3 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

这是一个与其他答案不同的解决方案,希望能解决您对容器特殊用途的担忧:


namespace AutofacTest

{

    public interface IServiceA { }

    public interface IServiceB { }


    public class ServiceA : IServiceA

    {

    }


    public class ServiceB : IServiceB

    {

        private readonly IServiceA _serviceA;


        public ServiceB (IServiceA serviceA)

        {

            _serviceA = serviceA;

        }

    }


    public class MyConsumer

    {

        private readonly IServiceA _serviceA;

        private readonly IServiceB _serviceB;


        public MyConsumer(Func<IServiceA> serviceAFactory, Func<IServiceA, IServiceB> serviceBFactory)

        {

            _serviceA = serviceAFactory();

            _serviceB = serviceBFactory(_serviceA);

        }

    }

}

在这个解决方案中,我注入工厂而不是实例,然后调用它们来获取实例。这个实现有点难看的一件事是参数顺序现在很重要。


如果你真的不希望顺序很重要,你可以IServiceA在IServiceB接口上公开一个 setter ,然后用类似的东西替换构造函数


public MyConsumer(Func<IServiceA> serviceAFactory, Func<IServiceB> serviceBFactory)

{

    _serviceA = serviceAFactory();

    _serviceB = serviceBFactory(_serviceA);

    _serviceB.SetServiceA(_serviceA);

}


查看完整回答
反对 回复 2021-06-26
  • 3 回答
  • 0 关注
  • 154 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信