[英]MEF: Unable to import in other classes?
编辑:马特,这确实解决了我的一些(大多数)问题,谢谢。 现在唯一挥之不去的问题是如何在WPF中执行此操作? 我有一个基于UserControl
的自定义部件,但WPF无法做到:
[Import]<my:SomeCustomControl>
所以级联在这种情况下不起作用。
/编辑
我在项目中遇到[导入]各种MEF组件的问题。 我是否必须在我使用的每个类中使用CompositionContainer? 在下面的代码中,Helper.TimesTwo()方法中抛出了一个空引用异常,但是当我在Program类中调用logger.Log()时,一切正常。 任何帮助将不胜感激。
(这将编译并作为控制台应用程序运行)。
using System;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
var p = new Program();
p.Run();
}
[Import]
private ILog logger { get; set; }
public void Run()
{
var catalog = new DirectoryCatalog(".");
var container = new CompositionContainer(catalog);
var batch = new CompositionBatch();
batch.AddPart(this);
container.Compose(batch);
logger.Log("hello");
var h = new Helper();
logger.Log(h.TimesTwo(15).ToString());
Console.ReadKey();
}
}
class Helper
{
[Import]
private IDouble doubler { get; set; }
private Helper()
{
// do I have to do all the work with CompositionContainer here again?
}
public double TimesTwo(double d)
{
return doubler.DoubleIt(d);
}
}
interface ILog
{
void Log(string message);
}
[Export(typeof(ILog))]
class MyLog : ILog
{
public void Log(string message)
{
Console.WriteLine("mylog: " + message);
}
}
interface IDouble
{
double DoubleIt(double d);
}
[Export(typeof(IDouble))]
class MyDoubler : IDouble
{
public double DoubleIt(double d)
{
return d * 2.0;
}
}
}
我认为诀窍是利用MEF将其进口级联的事实。 因此,如果您导入Helper实例而不是将其声明为局部变量,则将满足Helper所需的任何导入。
[Import]
public Helper MyHelper { get; set; }
public void Run()
{
var catalog = new DirectoryCatalog(".");
var container = new CompositionContainer(catalog);
var batch = new CompositionBatch();
batch.AddPart(this);
container.Compose(batch);
logger.Log("hello");
logger.Log(MyHelper.TimesTwo(15).ToString());
Console.ReadKey();
}
我确信有一种方法可以满足局部变量中的任何导入,但我喜欢使用像这样的“级联导入”功能。
不,你不能那样做。 您可以考虑使用附加属性。 使用附加属性,您可以让容器组成添加附加属性的元素。 另一种选择是标记扩展。
格伦
尝试改变
[Import]
private ILog logger { get; set; }
至
[Import]
public ILog logger { get; set; }
它可能会奏效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.