[英]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.