如何松散地引用Prism中的模块以便它们能够存在还是不存在?

时间:2009-07-20 15:32:45

标签: wpf inversion-of-control unity-container prism containers

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不再存在

2 个答案:

答案 0 :(得分:5)

这就是接口的用武之地。你需要这样的东西:

public interface IMenuSystem
{
    // whatever operations need to be offered by a menu system
}

Application.exeCustomers.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接口并在那里实现它。