【问题标题】:C# Circular dependencies in Unity with Ctor injectionUnity中的C#循环依赖与Ctor注入
【发布时间】:2011-10-10 10:31:42
【问题描述】:

我知道之前在此处讨论过使用 prism/unity 进行依赖注入的循环依赖问题。

但我还是不明白。假设有以下类:

class Feeder : IFeeder    { 
  IManager _MM, 
  Feeder(IManager MM)
  {
     this._MM = MM;
  }
  public void Start()
  {
  ...
  }
  public void Stop()
  {
  ...
  }
  private Propagate()
  {
     _MM.ConsumeFeed()
  }
};

class FeedManager : IManager
{
   IFeeder _Feeder;
   FeedManager(IFeeder Feeder)
   {
      this._Feeder = Feeder;
   }
   public ConsumeFeed()
   {
   ...
   }
   private Shutdown()
   {
      _Feeder.Stop();
   }
   private StartUp()
   {
      _Feeder.Start();
   }
};

这显然是一个循环依赖,因为 Feeder 依赖于 FeedManager,反之亦然。我没有看到一个明确的方法来解决这个问题,因为它看起来是一个非常自然的设计。

当您关注link 时,会提示您提取一些方法,但我仍然不知道如何解耦这些对象。 我读到了依赖倒置、观察者模式、共享对象、事件等等。 对我来说,在两个对象之间实现简单的关系似乎有点过头了。

解决此问题的唯一方法是处理应用程序或共享对象中的一百万个事件吗? 谢谢你的帮助,于尔根

【问题讨论】:

    标签: c# unity-container prism circular-dependency


    【解决方案1】:

    我会让 IFeeder.Propagate 方法成为 IManager 实例注册到的事件。这样你就没有循环引用了。

    顺便说一句,你这里的例子与团结无关。在我看来,这更像是一个设计问题而不是统一问题。

    【讨论】:

    • 是的,这是一个设计问题。问题是,unity 使用了 Ctor 注入,并且可以通过适当的注入(一种延迟的实例化机制)来克服这个问题。所以一般来说,要避免这种情况是使用事件。但正如我所说,我想避免在应用中出现一百万个事件。
    • 为什么要避免事件?在我看来,没有理由避免事件。
    • 假设 FeedManager 也引发了一个应该由 Feeder 消费的事件。然后又是循环依赖。在这种情况下,eventtaggregator 会是解决方案吗?
    • 那你又犯了同样的错误。对象通常具有层次结构。一个是父母,一个是孩子。父母打电话给孩子,但孩子从不打电话给父母。如果父对象对子对象发生的事情感兴趣,它必须注册到指示这些事件的事件。请不要误会我的意思,但我觉得你应该先看看一些 OOP 基础知识。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多