2

这个 stackoverflow 问题中,我了解到Prism/Unity 并不像我想象的那样解耦,例如,如果我有一个将 menuManager 注入其构造函数的类,那么我必须确保这个类确实存在于某个地方(我认为你可以只需拉出包含类的 .dll,容器就会处理它,例如在其位置注入 null):

public class EmployeesPresenter
{
    public EmployeesPresenter(IMenuManager menuManager)
    {

    }
}

但我可以解决这个问题:如果没有 MenuModule,应用程序就无法运行(或者,正如建议的那样,我可以拥有一个NullMenuModule,它什么都不做,只是防止应用程序崩溃)。

但是,我正在构建的应用程序将在 MenuModule 中有一个MenuManager 类,并且每个模块都必须使用 MenuManager 注册它想要在菜单中拥有的所有内容。但是,我希望能够换掉 MenuModules例如有一个InfragisticsMenuModule并有一个TelerikMenuModule等。

但是,当我在客户模块中时,为了使用 TelerikMenuModule,我需要引用它。当我想使用 InfragisticsMenuModule 时,我需要参考它。

那么我如何能够在不使用新引用重新编译所有模块的情况下使用 InfragisticsMenuModule “热交换” TelerikMenuModule,例如,我想替换它:

Application.exe
Customers.dll
TelerikMenuModule.dll

有了这个:

Application.exe
Customers.dll
InfragisticsMenuModule.dll

并且只需重新启动应用程序,它就会使用新的 InfragisticsMenuModule.dll 运行,并且不会抱怨 TelerikMenuModule.dll 不再存在

4

2 回答 2

5

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

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

Application.exe并且Customers.dll可能只引用该接口。他们不允许了解特定的实现。

然后,您将使用配置步骤(调用Register...方法或使用配置文件)来指定哪种类型将提供MenuSystem.

于 2009-07-20T15:41:32.327 回答
2

出于显而易见的原因,这里想到了 MEF,它是为这样的东西而设计的。我没有机会使用 Unity,所以我不确定它是否有这样的内置功能(即扫描目录以查找 IMenuModule 实现),但 MEF 可以做到这一点。

建议也是将此 IMenuModule 放在一个通用程序集中(与您的其他程序集分开)。我通常把这个东西叫做Something.Core.dll。

因此,您可能拥有:Application.exe、Customer.dll、Application.Core.dll 和您的特定 MenuModule 实现。

您的特定 MenuModule 实现将引用 Application.Core 程序集以访问其 IMenuModule 接口并在那里实现它。

于 2009-07-20T15:45:27.450 回答