C#MEF在静态类中的用法
我的解决方案中有一个静态类,用于处理各种程序集。我想通过MEF链接它们,所以我在一个类中创建了一个字段C#MEF在静态类中的用法,c#,.net,c#-4.0,mef,C#,.net,C# 4.0,Mef,我的解决方案中有一个静态类,用于处理各种程序集。我想通过MEF链接它们,所以我在一个类中创建了一个字段 [Import(typeof(A))] static private A _a1; 然后我有一个方法,将程序集名称作为参数传递给该方法: public static A LoadPackage(string filePath) { var catalog = new AggregateCatalog(); catalog
[Import(typeof(A))]
static private A _a1;
然后我有一个方法,将程序集名称作为参数传递给该方法:
public static A LoadPackage(string filePath)
{
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new AssemblyCatalog(filePath));
var _container = new CompositionContainer(catalog);
???
}
现在有没有办法从filepath指定的程序集中导入类型
我做不到:
_container.ComposeParts(this);
因为类是静态的,我也不能这样做
_container.ComposeParts(_a1);
(一开始这可能是完全错误的)因为
A
没有任何构造函数(因此\u a1
为空)MEF设计用于为您创建和初始化对象。它不处理静态类中的状态
我建议您将该类及其字段设置为非静态,并使用[PartCreationPolicy(CreationPolicy.Shared)]
对其进行标记,以强制执行单例行为
另请参见MEF和singleton模式。事实证明,我正在寻找的方法是
GetExportedValue
(是的,我忽略了基本功能):
静态私有A_a1;
公共静态加载包(字符串文件路径)
{
var catalog=new AggregateCatalog();
catalog.Catalogs.Add(新的AssemblyCatalog(文件路径));
var _container=新合成容器(目录);
_a1=_container.GetExportedValue();
}
我把我的字段填好了(以防万一,我已经把它移到了另一个类中,现在看起来整洁干净)有什么原因需要它是静态的吗?默认情况下,您导入/导出的任何内容都将是Singleton,这比在大多数情况下使用静态类要好。这是我正在考虑的选项之一。保持静态的原因是我不想在整个项目中更改代码。(即-我很懒+)我很确定您不能直接在MEF中使用静态类,但我不确定这一点。我不确定我是否完全理解您要做的事情,但是,如果您将DLL加载到主机应用程序中,您也应该能够在DLL之间导入内容。无需重新组合零件。这就是它当前的工作方式(通过属性)。但在应用程序的另一部分,MEF用于提供类似的服务,我的上级希望在这两种情况下使用相同的解决方案。嗯,或者他想玩弄MEF:PNot不是一个好的解决方案——正如上面Wim提到的,最好只使用共享部件的MEF导入,尽可能避免静态类/方法。
static private A _a1;
public static A LoadPackage(string filePath)
{
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new AssemblyCatalog(filePath));
var _container = new CompositionContainer(catalog);
_a1 = _container.GetExportedValue<A>();
}