我的Unity和bootloader存在严重问题。这是一个循环参考。
让我解释一下我目前的情况:
MainApp(winforms)
ServiceLayer - C#项目
DependencyInjection - 容器的C#项目
Bootloader - 引导加载程序的C#项目,用于为automapper和Unity做映射。
现在,书载程序引用了所有内容,即服务,容器等主要应用程序(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中的类型但是这不会破坏我的引导程序的对象,它会处理所有事情吗?
答案 0 :(得分: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 :(得分:1)
为什么不将DependencyInjection项目设置为启动项目,在其中编写Main方法,然后从那里调用引导加载程序?唯一重要的变化是你需要让DI项目成为EXE而不是DLL,反之亦然,UI项目。
答案 2 :(得分:0)
这可能是一个设计问题。另一层间接怎么样? :)
但严重的是:你在主应用程序中使用的引导加载程序是什么?难道不可能把它移到它自己的装配中吗?
其他看起来很奇怪的是主应用程序和引导程序之间的关系。它们似乎紧密耦合,因此引导程序的用途是什么?是不是可以简单地将bootloader类放在主应用程序中?
只需要在设置上触摸更多信息。