【问题标题】:.Net Core 2.2, Ioc container - set property after the construction of the object.Net Core 2.2,Ioc容器——构建对象后设置属性
【发布时间】:2019-11-02 05:07:54
【问题描述】:

如何设置ServiceCollection中注册的服务在构建后的属性。我不能将值传递给构造函数,因为它会导致循环依赖。 想要的行为:

   public class ServiceA : IServiceA
   {
        public ServiceA(IServiceB serviceB)
        {
            ServiceB = serviceB;
        }
        IServiceB ServiceB {get; set;}
   }

   public class ServiceB : IServiceB
   {
       ServiceA {get; set;}
   }

   services.AddSingleton<IServiceA, ServiceA>();
   services.AddSingleton<IServiceB, ServiceB>();
   //I need something like this
   services.Inject<IServiceB>((serviceB, serviceProvider) => 
  {
      serviceB.ServiceA = serviceProvider.GetService<IServiceA>();
  });

【问题讨论】:

    标签: asp.net-core .net-core inversion-of-control ioc-container service-provider


    【解决方案1】:

    为什么要调用构造函数?

    怎么样:

    public class ServiceB : IServiceB
    {
        private readonly IServiceA _serviceA
        public ServiceB(IServiceA serviceA)
        {
             _serviceA = serviceA;
        }
    
        public IServiceA ServiceA {get { return _serviceA;}}
    }
    

    我在这里看不到任何循环引用,除非 ServiceA 需要 ServiceB 并且您还没有证明这一点。到目前为止,这是一个线性设置。

    【讨论】:

    • 是的,ServiceA 应该引用 ServiceB,反之亦然。我将更新问题以使其更清楚。
    • 那么我不想这么说,但我认为设计存在根本缺陷。如果你有这种循环依赖,那么没有 Ioc 就不是好事,而且 Ioc 也不会解决这个问题。听起来您需要一个 IServiceC 来处理非常具体的事情,因为循环引用通常是一个很好的迹象,表明问题中的接缝位置存在错误识别。
    • 可能有,但无论如何我都想要答案。顺便说一句,发生这种情况是因为这里描述的情况:softwareengineering.stackexchange.com/questions/393493/… 如果您能提出更好的解决方案,我将不胜感激!
    猜你喜欢
    • 2018-06-23
    • 2019-09-02
    • 2019-08-16
    • 1970-01-01
    • 2016-03-24
    • 2019-08-29
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    相关资源
    最近更新 更多