我的bootloader / Unity的循环引用

问题描述 投票:1回答:3

我的Unity和bootloader存在严重问题。这是一个循环参考。

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

MainApp(winforms)

ServiceLayer - C#项目

DependencyInjection - 容器的C#项目

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

现在,书籍装载程序引用了所有内容,即服务,容器等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移到自己的程序集中,而Container也有自己的程序集;引导程序需要包括MainApp在内的所有引用,但MainApp当然需要引用引导程序来创建它并启动它。

编辑

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

c# dependency-injection unity-container ioc-container circular-dependency
3个回答
1
投票

我不是这个主题的专家,我找到你的帖子的原因是因为我正在寻找类似问题的帮助,但我想也许我们的问题之间有一些重叠,也许我到目前为止尝试过的东西也许可以帮助你,或指出你可以取得一些进展的方向。

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

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

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

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

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

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

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

我希望这有帮助。


1
投票

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


0
投票

这可能是一个设计问题。另一层间接怎么样? :)

但是严肃地说:你在主应用程序中使用的引导加载程序是什么?难道不可能将它移到它自己的装配中吗?

其他看起来很奇怪的是主应用程序和引导程序之间的关系。它们似乎紧密耦合,因此引导程序的用途是什么?是不是可以简单地将bootloader类放在主应用程序中?

只需要在设置上触摸更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.