【问题标题】:Circular reference with my bootloader / Unity使用我的引导加载程序 / Unity 进行循环引用
【发布时间】:2011-07-27 15:54:42
【问题描述】:

我的 Unity 和引导加载程序存在严重问题。这是一个循环引用。

让我解释一下我目前的情况:

MainApp (winforms)

ServiceLayer - C# 项目

DependencyInjection - 容器的 C# 项目

Bootloader - 用于引导加载程序的 C# 项目,用于为 automapper 和 Unity 进行映射。

现在 bookloader 引用了所有内容,即服务、容器等 mainApp(winforms),它的工作做得很好。

问题是我像这样从我的 MainApp (winforms) 启动引导加载程序

 DI.Container.RegisterType<IBootstrapper, Bootstrapper>(
    new InjectionConstructor(DI.Container));

            var bootstrapper = DI.Container.Resolve<IBootstrapper>();

            bootstrapper.StartUp();

现在的问题如下,MainApp 需要对 Bootloader 的引用,因为那是类和接口所在的位置 - 但我不能,因为 Bootloader 有对 MainApp 的引用,因为引导加载程序注册了 mainapp 中的一些内容.

我想我在某个地方感到困惑,主要想法是将引导程序从 mainapp 移到它自己的程序集中,并且容器也有自己的程序集; bootstrapper 需要它的所有引用,包括对 MainApp 的引用,但 Mainapp 当然需要对 bootstrapper 的引用来创建和启动它。

编辑

我当然可以通过直接访问容器来注册 mainapp 中的类型,但这不会破坏让我的引导加载程序处理所有事情的目标吗?

【问题讨论】:

    标签: c# dependency-injection unity-container ioc-container circular-dependency


    【解决方案1】:

    我不是这个主题的专家,我发现你的帖子的原因是因为我正在寻求类似问题的帮助,但我认为我们的问题之间可能存在一些重叠,也许我的问题到目前为止尝试过可能会对您有所帮助,或者为您指明一个可以让您取得一些进展的方向。

    如果你想查看我写的所有东西,包括一些图表,你可以在这里找到: Using StructureMap, is one of these project organizations better than another?

    如果有更好的答案,希望有人指出,我也会从中学习。

    基本上,我认为你有几个选择。

    您可以将引导加载程序和 MainApp 合并到同一个项目中。 (正如你所说,这似乎是“错误的”)

    您可以将 BootLoader 所需的 MainApp 中的代码移动到另一个程序集中,然后从 BootLoader 和 MainApp 中引用它。

    您可以从 MainApp 中删除对 BootLoader 的引用,然后使用 Unity 查看是否有其他方法可以在运行时自动获取对 BootLoader 的引用。我正在使用 StructureMap,它有一个功能,您可以告诉它扫描一些程序集(在应用程序启动时),然后您可以告诉它应用“默认约定”,这意味着如果有一个名为 IWhatever 的接口和一个类不管:IWhatever,然后它会自动设置它,所以请求 IWhatever 的实例会给你一个具体的 Whatever 实例。

    这样,您可以在编译时让 BootLoader 引用 MainApp,但在 MainApp 中仍有代码可以在运行时访问 BootLoader 中的内容(通过使用 IOC 并通过接口)。

    我希望这会有所帮助。

    【讨论】:

    • 很好的解释......现在一切正常......将东西从我的 mainapp 移到一个单独的程序集中......现在我不需要对 mainapp 的引用。
    【解决方案2】:

    为什么不将您的 DependencyInjection 项目设置为启动项目,在其中编写一个 Main 方法,然后从那里调用您的引导加载程序?唯一重要的变化是您需要将 DI 项目设置为 EXE 而不是 DLL,对于 UI 项目反之亦然。

    【讨论】:

      【解决方案3】:

      这可能是设计问题。另一层间接呢? :)

      但说真的:您的引导加载程序在主应用程序中使用的是什么?是不是不可能把它移到它自己的程序集中?

      其他看起来很奇怪的是主应用程序和引导加载程序之间的关系。它们看起来非常紧密耦合,那么引导加载程序的用途是什么?是不是不能简单的把bootloader类放到主app里?

      只需要了解有关您的设置的更多信息。

      【讨论】:

      • 谢谢埃本!这就是我所做的......我把它移到一个单独的程序集中
      猜你喜欢
      • 2010-11-20
      • 1970-01-01
      • 2021-04-06
      • 2012-01-30
      • 1970-01-01
      • 2015-02-24
      • 2011-11-05
      • 2014-10-03
      • 1970-01-01
      相关资源
      最近更新 更多