首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mef2在每个模块中配置注册

Mef2在每个模块中配置注册
EN

Stack Overflow用户
提问于 2013-03-29 00:14:47
回答 1查看 1.6K关注 0票数 3

好的,我在一个使用.Net 4.5的C# WPF应用中使用Caliburn Micro和Mef2。我想知道是否有任何方法可以在单独的dll中配置我的Mef2注册,然后在我的主dll中使用它们。基本上,dll将配置它自己的导入和导出。

类似于:

代码语言:javascript
复制
RegistrationBuilder builder = new RegistrationBuilder();

        builder.ForTypesDerivedFrom<IShell>().Export<IShell>().SetCreationPolicy(CreationPolicy.Shared);
        builder.ForTypesDerivedFrom<IFindProducts>().Export<IFindProducts>().SetCreationPolicy(CreationPolicy.Shared);
        builder.ForTypesMatching(t => t.Name.EndsWith("ViewModel")).Export().SetCreationPolicy(CreationPolicy.NonShared);

        return builder;

在每个dll中,但我被困在将所有注册合并到一个RegistrationBuilder中,然后传递到每个目录中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-29 23:26:13

一种方法是将RegistrationBuilder传递给每个程序集进行更新。这可以通过添加如下接口来完成:

代码语言:javascript
复制
public interface IRegistrationUpdater
{
    void Update(RegistrationBuilder registrationBuilder);
}

在协定程序集中。这将被所有需要注册MEF2约定的程序集引用。例如:

代码语言:javascript
复制
public class RegistrationUpdater: IRegistrationUpdater
{
    public void Update(RegistrationBuilder registrationBuilder)
    {
        if (registrationBuilder == null) throw new ArgumentNullException("registrationBuilder");

        registrationBuilder.ForType<SomeType>().ImportProperty<IAnotherType>(st => st.SomeProperty).Export<ISomeType>();
        registrationBuilder.ForType<AnotherType>().Export<IAnotherType>();
    }
}

其中SomeType实现了ISomeTypeAnotherType实现了IAnotherTypeIAnotherType不需要部件。ISomeType需要一个IAnotherType部件。

然后,在您的主程序中,您需要使用如下命令查找可用的IRegistrationUpdaters:

代码语言:javascript
复制
static IEnumerable<IRegistrationUpdater> GetUpdaters()
{            
    var registrationBuilder = new RegistrationBuilder();
    registrationBuilder.ForTypesDerivedFrom<IRegistrationUpdater>().Export<IRegistrationUpdater>();
    using (var catalog = new DirectoryCatalog(".", registrationBuilder))
    using (var container = new CompositionContainer(catalog))
    {
        return container.GetExportedValues<IRegistrationUpdater>();
    }  
}

然后可以使用它来遍历每个更新器并调用IRegistrationUpdater.Update(RegistrationBuilder)

代码语言:javascript
复制
var mainRegistrationBuilder = new RegistrationBuilder();
foreach (var updater in GetUpdaters())
{
    updater.Update(mainRegistrationBuilder);
}

var mainCatalog = new DirectoryCatalog(".", mainRegistrationBuilder);
var mainContainer = new CompositionContainer(mainCatalog);

var s = mainContainer.GetExportedValue<ISomeType>();
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15686874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档