C# 使用运行时定义的契约动态注册MEF导出

C# 使用运行时定义的契约动态注册MEF导出,c#,.net,mef,C#,.net,Mef,我试图动态地(使用反射)向MEF目录添加类型,并在运行时定义导出契约。问题是MEF将简单地使用类型的完全限定名作为合同,我需要将导出合同指定为特定的接口类型 以下是用于获取需要添加到MEF目录的类型的代码: private void RegisterSupportedRepositories(Func<ObjectContext> contextProvider) { var context = contextProvider(); var p

我试图动态地(使用反射)向MEF目录添加类型,并在运行时定义导出契约。问题是MEF将简单地使用类型的完全限定名作为合同,我需要将导出合同指定为特定的接口类型

以下是用于获取需要添加到MEF目录的类型的代码:

private void RegisterSupportedRepositories(Func<ObjectContext> contextProvider)
    {
        var context = contextProvider();
        var properties = context.GetType().GetProperties();
        var entitySets = properties.Where(property => property.PropertyType.Name == typeof(ObjectSet<>).Name);

        foreach (var entitySet in entitySets)
        {
            var entityType = entitySet.PropertyType.GetGenericArguments()[0];
            var repositoryType = typeof(EFRepository<>).MakeGenericType(entityType);
            ComponentServices.RegisterComponent(repositoryType);                
        }
    }
我需要能够将添加类型的契约指定为接口,这通常会通过如下所示的导出属性完成:

[Export(typeof(IRepository<Customer>))]
[Export(typeof(IRepository))]

问题是如何动态添加此导出协定,以便导出相当于上面所示的内容,而不是MEF从类型本身推断的默认“eRepository”协定。

如果您可以使用MEF的CodePlex预览版本,我建议使用新的RegistrationBuilder来执行此操作。下面是一篇描述它的博客文章:


如果无法使用预览版本,则可以使用中的方法创建自己的零件定义,并创建使用它们的目录实现。

如果可以使用MEF的CodePlex预览版本,则建议使用新的RegistrationBuilder执行此操作。下面是一篇描述它的博客文章:


如果不能使用预览版本,可以使用中的方法创建自己的零件定义,并创建使用这些定义的目录实现。

Daniel,感谢您为我指明了正确的方向,我已经创建了自己的类型目录,它同时使用ReflectionModelServices和AttributeModelServices;现在我可以动态地向MEF添加非属性化类型了。Daniel,感谢您为我指明了正确的方向,我已经构建了自己的类型目录,它同时使用ReflectionModelServices和AttributedModelServices;现在我可以动态地将非属性类型添加到MEF。
[Export(typeof(IRepository<Customer>))]