欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
MEF程序設計指南三:MEF中組合部件(Composable Parts)與契約(Contracts)的基本應用

按照MEF的約定,任何一個(gè)類(lèi)或者是接口的實(shí)現都可以通過(guò)[System.ComponentModel.Composition.Export] 屬性將其他定義組合部件(Composable Parts),在任何需要導入組合部件的地方都可以通過(guò)在特定的組合部件對象屬性上使用[System.ComponentModel.Composition.Import ]實(shí)現部件的組合,兩者之間通過(guò)契約(Contracts)進(jìn)行通信,實(shí)際上這一步可以簡(jiǎn)單的理解為“依賴(lài)注入”,本質(zhì)上就是對象的實(shí)例初始化過(guò)程。

 

  我個(gè)人理解,凡是通過(guò)MEF的[ExportAttribute]標注的對象都可以理解為一個(gè)可進(jìn)行組合的部件,包括對象和對象的屬性、字段、方法、事件等;且該對象可以通過(guò)[ImportAttribute]進(jìn)行導入。如下示例代碼:

public class StringProvider
{
    
/// <summary>
    
/// 定義導出部件--契約為“Message”
    
/// </summary>
    [Export("Message")]
    
public string Output
    {
        
get { return "Hello World"; }
    }
}

public class Client
{
    
/// <summary>
    
/// 導入指定契約的部件
    
/// </summary>
    [Import("Message")]
    
public string Input { getset; }

    
public void Print()
    {
        Console.WriteLine(Input);
    }
}

 

  所謂的契約也就是一種約定,或者叫做一種規則。如上代碼中就使用到了契約,在對象StringProvider中就定義了一個(gè)導出部件屬性(Output),并為其指定了通信契約為“Message”。這里的“Message”就是一種約定,既約定為在需要使用到這個(gè)屬性的地方,都可以通過(guò)[ImportAttribute]使用契約(Message)進(jìn)行部件的導入。

 

  接下來(lái)結合《Silverlight中使用CompositionInitializer宿主MEF》一文中使用的日志記錄的應用實(shí)例為基礎來(lái)看看關(guān)于契約(Contracts)在較為復雜的部件中的的具體使用方法。假設定義了如下的接口與部件實(shí)現代碼:

public interface ILogger
{
    
void WriteLog(string message);
}
    
[Export(
typeof(ILogger))]
public class TXTLogger : ILogger
{
    
public void WriteLog(string message)
    {
        MessageBox.Show(
"TXTLogger>>>>>" + message);
    }
}

[Export(
typeof(ILogger))]
public class DBLogger : ILogger
{
    
public void WriteLog(string message)
    {
        MessageBox.Show(
"DBLogger>>>>>" + message);
    }
}

 

  對于熟悉面向對象設計方法的人一眼就能明白,上面代碼演示了一個(gè)接口具有多個(gè)實(shí)現的場(chǎng)景,仔細觀(guān)察會(huì )發(fā)現在每個(gè)實(shí)現類(lèi)上面都添加了[ExportAttribute]將其標注為導出部件,并為其添加了通信契約,而且兩個(gè)實(shí)現類(lèi)的通信契約都是使用的接口(ILogger)的類(lèi)型參數。

  這里需要注意的是在進(jìn)行導入的時(shí)候如果辨別到底是使用的哪一個(gè)實(shí)現呢?在MEF中提供了一個(gè)專(zhuān)門(mén)用于導入多個(gè)實(shí)現的特性[System.ComponentModel.Composition.ImportManyAttribute],如上的日志實(shí)現示例就可以通過(guò)如下的方式實(shí)現多部件導入。

[ImportMany]
public IEnumerable<ILogger> Loggers { getset; }

 

     

 

   ImportManyAttribute特性可以將實(shí)現接口的所有實(shí)現全部組合起來(lái)。下面為使用[ImportMany]的完整示例代碼:

namespace MEFTraining.CPC
{
    
public partial class MainPage : UserControl
    {
        [ImportMany]
        
public IEnumerable<ILogger> Loggers { getset; }

        
public MainPage()
        {
            InitializeComponent();

            CompositionInitializer.SatisfyImports(
this);
            
if (Loggers == null)
            {
                
foreach (var logger in Loggers)
                {
                    logger.WriteLog(
"Hello World");
                }
            }
        }
    }

    
public interface ILogger
    {
        
void WriteLog(string message);
    }

    [Export(
typeof(ILogger))]
    
public class TXTLogger : ILogger
    {
        
public void WriteLog(string message)
        {
            MessageBox.Show(
"TXTLogger>>>>>" + message);
        }
    }

    [Export(
typeof(ILogger))]
    
public class DBLogger : ILogger
    {
        
public void WriteLog(string message)
        {
            MessageBox.Show(
"DBLogger>>>>>" + message);
        }
    }
}

 

   上面介紹了如何在相同的契約下獲取所有導出部件的實(shí)例,在某種情況下或許我們就只直接指導需要使用那一種那個(gè)實(shí)現方式,那么是否可以通過(guò)直接指定一個(gè)“契約名”就可以從多個(gè)實(shí)現中獲取到指定的組合部件呢?答案是肯定的,接下來(lái)先看看在MEF中中對ExportAttribute和ImportAttribute的定義,源代碼如下:

public class ExportAttribute : Attribute
{
    
public ExportAttribute() : this((string)null, (Type)null){}
    
public ExportAttribute(Type contractType) : this((string)null, contractType){}
    
public ExportAttribute(string contractName) : this(contractName, (Type)null) { }
    
public ExportAttribute(string contractName, Type contractType)
    {
        
this.ContractName = contractName;
        
this.ContractType = contractType;
    }

    
public string ContractName { getprivate set; }
    
public Type ContractType { getprivate set; }
}

 

  ImportAttribute同ExportAttribute一樣提供了相同的重載構造函數,在將一個(gè)對象進(jìn)行導出部件處理的時(shí)候可以直接通過(guò)ImportAttribute的屬性給對象指定一個(gè)契約名,如本篇前面的日志組件的實(shí)現就可以修改為如下代碼格式。

public interface ILogger
{
    
void WriteLog(string message);
}
    
[Export(
"TXT"typeof(ILogger))]
public class TXTLogger : ILogger
{
    
public void WriteLog(string message)
    {
        MessageBox.Show(
"TXTLogger>>>>>" + message);
    }
}

[Export(
"DB"typeof(ILogger))]
public class DBLogger : ILogger
{
    
public void WriteLog(string message)
    {
        MessageBox.Show(
"DBLogger>>>>>" + message);
    }
}

 

  通過(guò)為不同的導出部件指定了特定的契約名稱(chēng),那么在裝配部件的時(shí)候就可以通過(guò)契約名進(jìn)行指定部件的裝配并組合部件,為了方便調用可以提供一個(gè)服務(wù)類(lèi),將不同的實(shí)現通過(guò)不同的契約名裝載組合起來(lái)以對系統提供一個(gè)統一的調用入口。以下為完整的示例代碼:

public partial class MainPage : UserControl
{
    
/// <summary>
    
/// 導入日志服務(wù)對象
    
/// </summary>
    [Import]
    
public LogService Service { getset; }

    
public MainPage()
    {
        InitializeComponent();

        CompositionInitializer.SatisfyImports(
this);

        Service.DBLogger.WriteLog(
"Hello MEF");
        Service.TXTLogger.WriteLog(
"Hello MEF");
    }
}

/// <summary>
/// 聚合不同的日志記錄部件,通過(guò)MEF進(jìn)行組合
/// </summary>
[Export]
public class LogService
{
    
/// <summary>
    
/// 根據契約名進(jìn)行部件的裝配
    
/// </summary>
    [Import("TXT")]
    
public ILogger TXTLogger { getset; }

    [Import(
"DB")]
    
public ILogger DBLogger { getset; }
}

public interface ILogger
{
    
void WriteLog(string message);
}

[Export(
"TXT"typeof(ILogger))]
public class TXTLogger : ILogger
{
    
public void WriteLog(string message)
    {
        MessageBox.Show(
"TXTLogger>>>>>" + message);
    }
}

[Export(
"DB"typeof(ILogger))]
public class DBLogger : ILogger
{
    
public void WriteLog(string message)
    {
        MessageBox.Show(
"DBLogger>>>>>" + message);
    }
}
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
MEF程序設計指南二:Silverlight中使用CompositionInitializer宿主MEF
MEF核心筆記(1)基礎應用
.NET 4 實(shí)踐 - 使用dynamic和MEF實(shí)現輕量級的AOP組件 (4) - Code Stream - 博客園
MEF核心筆記(4)細說(shuō)MEF中的Attribute [下]
C#進(jìn)階系列——MEF實(shí)現設計上的“松耦合”(一)
解讀ASP.NET 5 & MVC6系列(9):日志框架
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久