我在扩展一些现有的C#代码方面遇到了问题。
有一个从一个类导出的管理器类的实例。 它使用以下方法成功导入到其他几个类中:
[Import]
private Manager manager = null;
我已将相同的代码添加到新类中。它编译得很好,但在运行时,引用始终为null。
我显然错过了一些东西。
我真正希望看到的是导入所需的最少代码(两个类)。 除了在一个类中创建和导出对象(最好不是字符串或简单值)之外,它不需要做任何事情,并且在导入到另一个类时显示它是非null。 (我一直迷失在试图展示功能的其他示例的细节中,而不仅仅是一种可用的语法。)
请注意,我需要使用[导入]查看示例,而不是[导入(类型)]。
感谢。
答案 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; }