循环引用我的引导程序/ Unity

本文关键字:Unity 引导程序 我的 引用 循环 | 更新日期: 2023-09-27 18:03:48

我的Unity和bootloader有一个严重的问题。这是一个循环引用

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

MainApp (winforms)

ServiceLayer - c# project

DependencyInjection - c# Container项目

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中的东西。

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

编辑

我当然可以通过直接访问容器从主应用程序注册类型,但这不是失败的对象有我的引导加载程序,它照顾一切?

循环引用我的引导程序/ Unity

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

如果你想看我写的所有东西,包括一些图表,你可以在这里找到:使用StructureMap,这些项目组织中的一个比另一个更好吗?

如果有更好的答案,希望有人指出来,我也会从中吸取教训。

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

你可以把你的bootloader和MainApp合并到同一个项目中。(正如你所说,这似乎是"错误的")

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

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

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

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

这可能是设计问题。再来一层间接性怎么样?:)

但是说真的:你的引导加载程序在主应用程序中使用什么?难道不可能把它搬到它自己的集会上吗?

另一个看起来很奇怪的是主应用程序和引导加载程序之间的关系。它们似乎是紧密耦合的,那么引导加载程序的作用是什么呢?是不可能简单地把引导加载程序类在主应用程序?