C# Winforms插件体系结构中的IOC

C# Winforms插件体系结构中的IOC,c#,.net,dependency-injection,tdd,inversion-of-control,C#,.net,Dependency Injection,Tdd,Inversion Of Control,我正在使用一个有主程序的架构。当它启动时,它通过反射在执行路径中查找从基类继承的DLL。这些是插件 当新项目的新需求出现时,通常会创建一个新插件。这个插件有主插件类,然后可能还有许多其他类和windows窗体 主插件类有初始化方法,但作为类库,没有program.cs来连接依赖项 有没有办法通过app.config连接依赖项,或者你认为我应该避免使用IOC容器,而只是在插件类中使用一个工厂方法来连接依赖项 问题是,我可能无法更改主应用程序的代码以设置IOC容器所有主要IOC容器都能够使用app.

我正在使用一个有主程序的架构。当它启动时,它通过反射在执行路径中查找从基类继承的DLL。这些是插件

当新项目的新需求出现时,通常会创建一个新插件。这个插件有主插件类,然后可能还有许多其他类和windows窗体

主插件类有初始化方法,但作为类库,没有program.cs来连接依赖项

有没有办法通过app.config连接依赖项,或者你认为我应该避免使用IOC容器,而只是在插件类中使用一个工厂方法来连接依赖项


问题是,我可能无法更改主应用程序的代码以设置IOC容器

所有主要IOC容器都能够使用app.config或通过程序集发现机制(如您所述)连接依赖项。通常,主应用程序设置容器,然后根据容器查找插件(可以通过配置或上面描述的程序集探测进行配置)

对于SpringFramework.net,以app.config为例:


对于Castle Windsor来说,一个议会调查的例子:

虽然我认为你的问题有点模糊,但根据我从你的问题中收集到的信息,我不得不说国际奥委会很可能是最好的方式!如果您愿意,您可以使用IoC容器连接工厂,也可以使用它连接插件依赖项,我个人喜欢使用StructureMap。一个非常通用且易于使用的IoC容器

您可以使用app.config列出依赖项名称,然后向IoC提供名称以创建依赖项。然后使用类似Activator的方法创建实例。就个人而言,我会同时使用IoC和工厂。我将使用app.config指定依赖项名称,然后使用工厂来分发插件类的实例。最后,我将使用IoC容器来指定工厂的实现


希望这是有用的

我不太明白。为什么不能通过构造函数注入依赖项?我可以将依赖项接口放入构造函数参数中,但我不确定如何实现IOC容器,因为我没有program.cs作为连接它们的地方。它们如何知道何时执行程序集发现?这是可配置的/由应用程序代码控制的。我对Castle更为熟悉——在这种情况下,当您调用
container.Install
时就会发生这种情况,如我链接到的示例所示。我确信spring有一个非常类似的方法。我的问题是我可能无法触摸你想要引导插件的应用程序代码,而不触摸主应用程序代码。。。也许是一个插件?在一个插件中设置容器,让它探测或使用app.config查找并加载其他插件?这意味着要么a)所有其他插件与主应用程序的交互都通过你的插件插件,要么b)插件插件需要一种方式来告诉主应用程序“嘿,把这个其他插件加载到这里”我已经有了一个基类,它可能会以某种方式工作。看看Castle Windsor,我可以修改主应用程序,只需添加var container=new WindsorContainer()的最小代码;container.Install(从assembly.InDirectory(新的AssemblyFilter(“扩展”)));如果需要DI,每个插件都可以实现一个安装程序。反射代码就是这样做的,如果它找到正确类型的dll,它会创建一个实例,但这是主要的应用程序代码。此外,如果我有dll的负载,我可以使用它的app.config而不是主应用的app.config吗?