我们正在使用MEF实例化基于大型应用程序中各个模块之间接口的分类。 (也就是说,所有模块都可以访问这些接口,而类则不能访问。)
默认情况下,MEF将这些接口的实现作为单例进行管理,并且仅在类使用相应的Export
attribute装饰时才实例化它们实现的给定接口的类。
在某些情况下,仅存在接口以与MEF实例化对象进行有意义的交互。这些不能通过Export
属性导出同一接口的接口的实现没有任何意义。我已经发现InheritedExport
attribute,可以将其直接放置在界面上,从而可以通过MEF轻松访问界面的任何(非抽象的)实现。
现在,在我不希望MEF保持单例但每次给定接口创建一个新实例的情况下,我可以使用PartCreationPolicy
attribute传递CreationPolicy.NonShared
作为参数。
不幸的是,PartCreationPolicy
属性只能放在一个类上,因此我不能在我的接口上声明它。另外,它被标记为未继承,所以我也不能在接口的抽象基础实现上声明它。
如何在我的界面上正确指示该界面的任何(非抽象)实现都通过非共享零件创建策略导出了MEF?
目前,我看到的唯一选择是手动实例化对象。
显然,还没有办法检索可以通过Activator
class实例化的导出的 type (还是在那里? 1 )。
因此,我将不得不创建一个工厂接口,并让MEF实例化那个接口的实现,每个接口都根据请求创建我的实际类的实例。但是,这是一个比较麻烦的解决方案,因为它需要创建一个工厂类以及我想以非共享方式从MEF检索的我的每个类。
1 :有一个blogpost描述了如何检索导出的类型的方法。但是,它是通过手动扫描和分析目录的内容来实现的,在我看来,这似乎部分地消除了我们首先使用诸如MEF之类的框架的原因,而不是精心设计了基于反射的自定义扫描我们二进制文件中的所有类。