扩展MefModuleManager

时间:2014-02-24 18:09:25

标签: c# silverlight prism mef prism-4

我想扩展MefModuleManager。现在我正在寻找一种方法来做到这一点。 首先,我创建了自己的ModuleManager:

public class MyModuleManager : MefModuleManager {
    public MyModuleManager(IModuleInitializer moduleInitializer, IModuleCatalog moduleCatalog, ILoggerFacade loggerFacade) : base(moduleInitializer, moduleCatalog, loggerFacade) {
    }

    protected override void HandleModuleTypeLoadingError(ModuleInfo moduleInfo, Exception exception) {
        // ... my Code
    }
}

现在,在我的壳牌中,我(如Pr​​ism with Mef所述):

// The shell imports IModuleManager once to load modules on-demand.
// Due to SilverLight/MEF restrictions this must be public.
[Import(AllowRecomposition = false)]
public IModuleManager ModuleManager

我不知道,如何告诉Mef,MyModuleManager应使用MefModuleManager代替IModuleManager

1 个答案:

答案 0 :(得分:1)

为了让 MefBootStrapper 使用不同的依赖项,您需要使用 [Export] 属性声明自定义类。

然后,如果您希望 Mef 将自定义 ModuleManager 用于特定类型类,您可以在属性上添加一个参数,用于指定依赖类型解决如下:

[Export(typeof(IModuleManager))]
public class MyModuleManager : MefModuleManager
{
    [ImportingConstructor]
    public MyModuleManager(IModuleInitializer moduleInitializer, IModuleCatalog moduleCatalog, ILoggerFacade loggerFacade) : base(moduleInitializer, moduleCatalog, loggerFacade) {
    }

    protected override void HandleModuleTypeLoadingError(ModuleInfo moduleInfo, Exception exception) {
        // ... my Code
    }
}

请注意,我添加了 [ImportingConstructor] 属性,因此 BootStrapper 可以在初始化时传递请求的参数。这样,当 IModuleManager 实例发出请求时, Mef 会使用您的自定义 ModuleManager

有关详细信息,请参阅以下 MSDN棱镜指南一章:

我希望这有所帮助,问候。