2013-05-17 82 views
1

我想在我定义的类中获取导出的属性,但我认为某些东西是我不知道的。这里是我的处理程序类:C#:MEF导出属性

public class Handler 
{ 
    public string Message { get; private set; } 
    public void Create(string msg) 
    { 
     Message = msg; 
    } 
} 

我HandlerUser类是:

public class HandlerUser 
{ 
    [Export(typeof(Handler))] 
    public Handler MyHandler { get; set; } 
    public string Name { get; set; } 

    public HandlerUser() { MyHandler = new Handler(); } 
} 

在我的Program.cs我:

 var catalogs = new AggregateCatalog(); 
     var catalog = new ApplicationCatalog(); 
     catalogs.Catalogs.Add(catalog); 

     CompositionContainer pluginsCompositionContainer = new CompositionContainer(catalogs); 

     HandlerUser u1 = new HandlerUser(); 
     u1.MyHandler.Create("U1"); 
     HandlerUser u2 = new HandlerUser(); 
     u2.MyHandler.Create("U2"); 

     var exports = pluginsCompositionContainer.GetExports<Handler>(); 
     Console.Write(exports.Count()); 

我希望看到2个出口,他们应该有“U1”,“U2”作为他们的消息,但是我只看到一个,并且消息是空的。我无法弄清楚缺少什么,我简单地想要在代码中做出每个Handler的导出,并且能够做一些逻辑。任何帮助都会很棒。

+0

你有没有得到它的工作? –

+0

感谢您的回答,但该解决方案正是我用于'导出'当前的MEF类。把'Handle'类看作一个错误收集机制。我在MEF导出项目中创建'Handle'类的实例,因此除了获取对MEF导出类的引用外,我想要一个ErrorManager来收集所有导出的错误日志。换句话说,我在'HandlerUser'类中导出了两种不同类型的信息。一个是实际实现的原始输出,另一个是Handler类的其他实例。 – aminjam

回答

1

当使用MEF,你不能,你需要导出类本身,所以你的代码应该是这样的一些出口类的属性或方法(类型):

[Export(typeof(Handler))] 
    public class HandlerUser : Handler 
    { 
     public string Name { get; set; } 

     public HandlerUser() : base() 
     { 
     } 
    } 

但因为你正在使用MEF,这意味着您正在尝试为您的应用程序添加可扩展性,考虑到这一点,我将“处理”一个接口而不是一个类,这样任何人都可以实现他们想要的方式,他们只需要实现接口。

在这种情况下,会是这样的:

编辑:

我已经更新了答案清楚如何MEF作品与出口,你实际上可以导出属性,但不是在问题的背景下。当你这样做时,你将通过属性名称“Handler”来导出,而不是像类定义中那样使用typeof(Handler)。属性和方法导出是一个很酷的功能,但是有一些限制(方法导出的最大参数数量是4!),如果可能,更喜欢类导出。使用MEF出口

的更多信息,可以发现here

+4

你错了 - 导出对于属性和方法都是可能的。 –

+0

不,导出在此上下文中不可用,他想导出该类,以便通过类型定义获取它们。导出确实适用于属性,但是您导出的是字符串而不是类型,它们的声明是不同的。但我会更新答案以使其更清楚。 –

+3

可以通过具有两个导出属性来导出类的两个实例,其中getters返回完全构造的对象。不是说要走的路,而是有可能的。 –

0

,你看到的只是一个出口是因为CompositionContainer不知道你自己创建的另外两个对象的原因。

要让CompositionContainer使用另外两个Handlers,请将每个HandleUser传递给CompositionContainer.ComposeParts方法。这个将把处理程序注册到容器中。

pluginsCompositionContainer.ComposeParts(u1); 
pluginsCompositionContainer.ComposeParts(u2); 

然后当你出口,你会发现,他们并不是两个(如你最初的预期),但三。您自己创建并使用CompositionContainer.ComposeParts加上容器自动创建的那个(实际上是Lazy<Handler>)注册到容器中的两个。最后一个是你在示例代码中看到的那个。当您尝试访问此特定导出值时,容器将创建一个HandlerUser的实例,然后将引用返回给Handler