簡體   English   中英

MEF:無法在其他課程中導入?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM