欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#在MEF框架中手動導入依賴模塊

 更新時間:2022年06月22日 10:55:24   作者:天方  
這篇文章介紹了C#在MEF框架中手動導入依賴模塊的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

對于簡單的場景來講,在MEF中導入依賴模塊非常簡單,只要用ImportAttribute標記依賴的成員,MEF模塊會自動找到并創(chuàng)建該模塊。但有的時候我們依賴的模塊是上下文相關的,此時MEF框架的自動組裝滿足不了我們的需求了,這里以我之前的文章的一個Log插件為例:

    class HostModule
    {
        [Import]
        ILogger logger = null;

        public string Name { get; private set; }

        public HostModule(string name)
        {
            this.Name = name;
            Compose();

            logger.LogMessage("hello world");
        }

        void Compose()
        {
            var catalog = new AssemblyCatalog(this.GetType().Assembly);
            var container = new CompositionContainer(catalog);
            container.ComposeParts(this);
        }
    }

    interface ILogger
    {
        void LogMessage(string msg);
    }

    [Export(typeof(ILogger))]
    class ConsoleLogger : ILogger
    {
        public void LogMessage(string msg)
        {
            Console.WriteLine(DateTime.Now + ": " + msg);
        }
    }

現在我想要在Log信息中加入模塊名稱作為前綴,改成如下形式:

    [Export(typeof(ILogger))]
    class ConsoleLogger : ILogger
    {
        public string ModuleName { get; private set; }

        public void LogMessage(string msg)
        {
            Console.WriteLine(">> " + ModuleName + " | " + DateTime.Now + ": " + msg);
        }
    }

由于MEF框架不知道Logger.ModuleName和HostModule.Name的關系,無法直接通過ImportAttribute標記ModuleName屬性搞定。那么,我們該如何傳入這ModuleName呢?

通過構造函數導入:

這最直接想到的就是一種方式了,主要修改如下:

  • 在插件模塊中創(chuàng)建構造函數,參數為需要導入的依賴模塊,并且用ImportingConstructorAttribute標記構造函數。

  • 在構造函數中庸ImportAttribute標記參數

  • 在組裝函數中用ComposeExportedValue函數傳入參數

示例代碼如下:

    class HostModule
    {
        [Import]
        ILogger logger = null;

        public string Name { get; private set; }

        public HostModule(string name)
        {
            this.Name = name;
            Compose();

            logger.LogMessage("hello world");
        }

        void Compose()
        {
            var catalog = new AssemblyCatalog(this.GetType().Assembly);
            var container = new CompositionContainer(catalog);
            container.ComposeExportedValue("ModuleName", this.Name);
            container.ComposeParts(this);
        }
    }

    interface ILogger
    {
        void LogMessage(string msg);
    }

    [Export(typeof(ILogger))]
    class ConsoleLogger : ILogger
    {
        public string ModuleName { get; private set; }

        [ImportingConstructor]
        public ConsoleLogger([Import("ModuleName")] string moduleName)
        {
            this.ModuleName = moduleName;
        }

        public void LogMessage(string msg)
        {
            Console.WriteLine(">> " + ModuleName + " | " + DateTime.Now + ": " + msg);
        }
    }

這種方式一個比較大的缺點就是麻煩,上面的例子還好,如果要導入的參數比較多就顯得有點麻煩了。并且后續(xù)要新增一個依賴的模塊的話則要同時修改好幾處處地方,不夠集中,容易改漏,并且也不容易排查錯誤。

在成員中導入

在成員中導入的方式如下:

  • 在Host中用Export標記導出參數

  • 在插件模塊中用Import標記導入參數

修改后的代碼如下,我把修改的地方標記了一下:

    class HostModule
    {
        [Import]
        ILogger logger = null;

        [Export("ModuleName")]
        public string Name { get; private set; }

        public HostModule(string name)
        {
            this.Name = name;
            Compose();

            logger.LogMessage("hello world");
        }

        void Compose()
        {
            var catalog = new AssemblyCatalog(this.GetType().Assembly);
            var container = new CompositionContainer(catalog);
            container.ComposeParts(this);
        }
    }

    interface ILogger
    {
        void LogMessage(string msg);
    }

    [Export(typeof(ILogger))]
    class ConsoleLogger : ILogger
    {
        [Import("ModuleName")]
        public string ModuleName { get; private set; }

        public void LogMessage(string msg)
        {
            Console.WriteLine(">> " + ModuleName + " | " + DateTime.Now + ": " + msg);
        }
    }

這種方式改動更少更直觀,擴展性也更強,要好用得多了。

進一步解除限制

前面這種方式非常方便,但有一個限制:功能模塊是由MEF框架在組裝的時候創(chuàng)建的。但是,有的時候,功能模塊無法由MEF框架創(chuàng)建(例如在WPF程序中的UI對象,或者一些比較復雜的上下文相關對象),但是,這個時候我們如何手動導入依賴的外部模塊呢?MEF框架本身也是提供了比較完善的解決方案的:在執(zhí)行ComposeParts函數組裝的時候將兩個對象一并傳入一起組裝即可。

    class HostModule
    {
        ILogger logger = new ConsoleLogger();

        [Export("ModuleName")]
        public string Name { get; private set; }

        public HostModule(string name)
        {
            this.Name = name;
            Compose();

            logger.LogMessage("hello world");
        }

        void Compose()
        {
            var container = new CompositionContainer();
            container.ComposeParts(this, logger);
        }
    }

    interface ILogger
    {
        void LogMessage(string msg);
    }

    class ConsoleLogger : ILogger
    {
        [Import("ModuleName")]
        public string ModuleName { get; private set; }

        public void LogMessage(string msg)
        {
            Console.WriteLine(">> " + ModuleName + " | " + DateTime.Now + ": " + msg);
        }
    }

小結:雖然前面介紹的這三種方式看起來有不小差別,但歸根結底只是不同的組裝形式而已,只要掌握了MEF的組裝原理,就可以非常自由的組裝我們所需要的模塊,實現松耦合、簡單化、模塊化的程序。

到此這篇關于C#在MEF框架中手動導入依賴模塊的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • C#中值類型和引用類型的區(qū)別

    C#中值類型和引用類型的區(qū)別

    這篇文章介紹了C#中值類型和引用類型的區(qū)別,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-03-03
  • C# Xamarin利用ZXing.Net.Mobile進行掃碼的方法

    C# Xamarin利用ZXing.Net.Mobile進行掃碼的方法

    這篇文章主要介紹了C# Xamarin利用ZXing.Net.Mobile進行掃碼的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-06-06
  • c# Thread類的用法詳解

    c# Thread類的用法詳解

    這篇文章主要介紹了c# Thread類的用法的相關資料,幫助大家更好的理解和學習c#的相關知識,感興趣的朋友可以了解下
    2020-11-11
  • C# Winform實現表格復制粘貼效果

    C# Winform實現表格復制粘貼效果

    這篇文章主要為大家學習介紹了如何通過C# Winform實現表格復制粘貼效果,文中的示例代碼講解詳細,具有一定的參考價值,需要的可以了解一下
    2023-07-07
  • c#通過xpath讀取xml示例

    c#通過xpath讀取xml示例

    這篇文章主要介紹了c#通過xpath讀取xml示例,需要的朋友可以參考下
    2014-04-04
  • C#中數組初始化與數組元素復制的方法

    C#中數組初始化與數組元素復制的方法

    這篇文章主要介紹了C#中數組初始化與數組元素復制的方法,涉及C#中數組的創(chuàng)建、初始化及使用Array.Copy方法復制數組元素的技巧,需要的朋友可以參考下
    2015-04-04
  • C#實現的微信網頁授權操作邏輯封裝示例

    C#實現的微信網頁授權操作邏輯封裝示例

    這篇文章主要介紹了C#實現的微信網頁授權操作邏輯封裝,分析了微信網頁授權操作的原理、步驟并給出了C#實現的網頁授權操作邏輯封裝類,需要的朋友可以參考下
    2016-10-10
  • C#雙向鏈表LinkedList排序實現方法

    C#雙向鏈表LinkedList排序實現方法

    這篇文章主要介紹了C#雙向鏈表LinkedList排序實現方法,涉及C#雙向鏈表的定義與排序技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08
  • C#實現EPL?II格式打印與打印測試

    C#實現EPL?II格式打印與打印測試

    這篇文章介紹了C#實現EPL?II格式打印與打印測試的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C#實現俄羅斯方塊基本功能

    C#實現俄羅斯方塊基本功能

    這篇文章主要為大家詳細介紹了C#實現俄羅斯方塊的基本功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03

最新評論