在this stackoverflow question中,我了解到 Prism / Unity并不像我想象的那样脱钩,例如如果我有这个类将menuManager注入到它的构造函数中,那么我必须确保这个类实际上存在于某个地方(我认为你可以拉出.dll包含类和容器将处理它,例如在其位置注入null):
public class EmployeesPresenter
{
public EmployeesPresenter(IMenuManager menuManager)
{
}
}
但是我可以解决这个问题:如果没有MenuModule,应用程序就无法运行(或者根据建议,我可以使用 NullMenuModule ,它只会阻止应用程序中断)。
但是,我正在构建的应用程序将在MenuModule中有一个 MenuManager类,并且每个模块都必须使用MenuManager在菜单中注册它想要的所有内容。但是,我希望能够换出MenuModules ,例如拥有 InfragisticsMenuModule 并拥有 TelerikMenuModule 等。
然而,当我在CustomersModule,为了使用TelerikMenuModule,我需要引用它。当我想使用InfragisticsMenuModule时,我需要引用它。
那么我如何能够使用InfragisticsMenuModule“热交换”TelerikMenuModule而无需使用新参考重新编译所有模块,例如我想替换它:
Application.exe
Customers.dll
TelerikMenuModule.dll
用这个:
Application.exe
Customers.dll
InfragisticsMenuModule.dll
只需能够重新启动应用程序并使用新的InfragisticsMenuModule.dll运行,并且不会抱怨TelerikMenuModule.dll不再存在。
答案 0 :(得分:5)
这就是接口的用武之地。你需要这样的东西:
public interface IMenuSystem
{
// whatever operations need to be offered by a menu system
}
Application.exe
和Customers.dll
可能只会引用该界面。他们不允许了解具体的实施。
然后,您将使用配置步骤(调用Register...
方法或使用配置文件)来指定将提供MenuSystem
实现的类型。
答案 1 :(得分:2)
由于显而易见的原因,MEF在这里浮现在脑海中并且是为这样的东西而设计的。我没有机会使用Unity,所以我不确定它是否有像这样内置的内容(即扫描IMenuModule实现的目录),但MEF可以做到这一点。
建议还将此IMenuModule放在一个通用程序集中(与其他程序集分开)。我通常称这件事为Something.Core.dll。
所以你可能有:Application.exe,Customer.dll,Application.Core.dll和你特定的MenuModule实现。
您的特定MenuModule实现将引用Application.Core程序集以访问其IMenuModule接口并在那里实现它。