2009-02-01 86 views
3

編輯:馬特,這確實解決了我的一些(大部分)問題,謝謝。現在唯一的問題是我如何在WPF中執行此操作?我有一個基於定製的部分斷UserControl的但在WPF沒辦法的事:MEF:無法在其他類中導入?

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

回答

1

不,你不能那樣做。儘管如此,你可以考慮使用附加屬性。通過附加屬性,您可以讓容器組成附加屬性添加到的元素。另一種選擇是標記擴展。

格倫

+0

我想知道你是否看過這個,Glenn,因爲你最近接連發布了關於MEF + WPF的推文。 :) – 2009-02-03 01:06:29

4

我認爲訣竅是利用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(); 
    } 

我確定有一種方法可以讓它滿足局部變量中的任何輸入,但我喜歡使用這樣的「級聯輸入」功能。

1

嘗試改變

[Import]   
private ILog logger { get; set; } 

[Import]   
public ILog logger { get; set; } 

它可能會奏效。