MEF [导入] C#示例

时间:2011-06-22 00:30:08

标签: c# syntax import mef

我在扩展一些现有的C#代码方面遇到了问题。

有一个从一个类导出的管理器类的实例。 它使用以下方法成功导入到其他几个类中:

[Import]
private Manager manager = null;

我已将相同的代码添加到新类中。它编译得很好,但在运行时,引用始终为null。

我显然错过了一些东西。

我真正希望看到的是导入所需的最少代码(两个类)。 除了在一个类中创建和导出对象(最好不是字符串或简单值)之外,它不需要做任何事情,并且在导入到另一个类时显示它是非null。 (我一直迷失在试图展示功能的其他示例的细节中,而不仅仅是一种可用的语法。)

请注意,我需要使用[导入]查看示例,而不是[导入(类型)]。

感谢。

2 个答案:

答案 0 :(得分:4)

我很确定这会奏效:

public class SampleClass
{
    [Import]
    private Manager manager; //Setting it to null is redundant.
}


[Export]
public class Manager
{
}

您还需要设置容器。有一些框架可以更容易地连接所有内容,但如果没有。这并不难:

在申请开始时,您需要填写目录:

//http://mef.codeplex.com/wikipage?title=Using%20Catalogs
var catalog = new AggregateCatalog();

//Add AssemblyCatalogs (Single) or DirectoryCatalogs (Multiple)
catalog.Catalogs.Add(new AssemblyCatalog(typeof(IManager).Assembly));
catalog.Catalogs.Add(new DirectoryCatalog(@"myimports\"));

//Don't do this (including the same assembly twice)
//catalog.Catalogs.Add(new AssemblyCatalog(typeof(Manager).Assembly));

var container = new CompositionContainer(catalog);
container.composeParts(this);

但是,您应该真正利用接口进行导入/导出。

public class SampleClass
{
    [Import]
    private IManager Manager;
}

[InheritedExport]
public interface IManager { }

public class Manager : IManager { }

现在,就陈述名称和类型而言,这是不必要的,但如果您计划进行类似的出口,则需要进行区分。

public class SomeClass
{
    //This is for the specific AdvancedManager
    [Import("AdvancedManager", typeof(IManager))]
    private IManager AdvancedManager;

    //This is for the specific SimpleManager
    [Import("SimpleManager", typeof(IManager))]
    private IManager SimpleManager;

    //If you don't mark it as ImportMany this will fail because now there
    //are 2 non-specific IManager exports.
    [ImportMany]
    private ICollection<IManager> AllManagers;
}

[InheritedExport]
public interface IManager { }

//This will export out as an IManager and a specifically named IManager
[Export("AdvancedManager", typeof(IManager))]
public class AdvancedManager : IManager { }

//This will export out as an IManager and a specifically named IManager
[Export("SimpleManager", typeof(IManager))]
public class SimpleManager : IManager { }

答案 1 :(得分:-1)

经理必须是财产。尝试 [Import] private Manager manager { get; set; }