使用RegistrationBuilder进行MEF导出无法生效的问题求助
MEF RegistrationBuilder注册错误修正
核心问题
你在使用RegistrationBuilder注册服务时,把实现类型和契约类型的调用逻辑写反了,同时存在多余的无效代码。
具体错误点
ForType<T>方法需要传入你要注册的服务实现类的类型,你错误传入了接口IService2Export<T>()方法需要传入你对外暴露的服务契约类型,你错误传入了实现类Service2- 代码中
container.SatisfyImportsOnce(builder)是无效调用,不需要对RegistrationBuilder实例执行注入
修正后代码
static class Program { [STAThread] static void Main() { // export service 2 using registration builder var builder = new RegistrationBuilder(); // 修正:ForType传实现类,Export传要导出的契约接口 builder.ForType<Service2>().Export<IService2>(); var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly(), builder); var container = new CompositionContainer(catalog, CompositionOptions.DisableSilentRejection); // 去掉多余的SatisfyImportsOnce调用 // service exported using attribute can be resolved var service1 = container.GetExport<IService1>(); // 现在可以正常解析 var service2 = container.GetExport<IService2>(); } } // create two dummy services public interface IService1 { } public interface IService2 { } // export service 1 with attribute [Export(typeof(IService1))] public class Service1 : IService1 { } public class Service2 : IService2 { }
验证说明
修正后运行代码,IService2可以正常从容器中解析,和特性导出的IService1行为一致。
内容的提问来源于stack exchange,提问作者Felix Almesberger
相关产品推荐
相关产品推荐

