Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#MEF在静态类中的用法_C#_.net_C# 4.0_Mef - Fatal编程技术网

C#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

我的解决方案中有一个静态类,用于处理各种程序集。我想通过MEF链接它们,所以我在一个类中创建了一个字段

[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>();
}