autofac文檔:元數據


AutoFac文檔

目錄

  1. 開始
  2. Registering components
  3. 控制范圍和生命周期
  4. 用模塊結構化Autofac
  5. xml配置
  6. 與.net集成
  7. 深入理解Autofac
  8. 指導
  9. 關於
  10. 詞匯表

元數據

Autofac提供機制去創建和使用component的元數據

如果你熟悉Managed Extensibility Framework (MEF) ,你很可能已經見過component元數據的例子。

元數據是存儲component中的關於這個component的信息,不需要創建實例也能訪問。

在注冊的時候添加元數據

值描述的元數據在注冊階段和component聯系起來,每個元數據都是一個鍵值對:

 builder.Register(c => new ScreenAppender())
.As<ILogAppender>()
 .WithMetadata("AppenderName", "screen");
 

用XML文件可以表示為

 <component
    type="MyApp.Components.Logging.ScreenAppender, MyApp"
    service="MyApp.Services.Logging.ILogAppender, MyApp" >
    <metadata>
        <item name="AppenderName" value="screen" type="System.String" />
     </metadata>
</component>
 

使用元數據

不用於一般的屬性,元數據和component本身是相互獨立額度。

這使得在運行條件下從很多component中選擇一個時非常有用,或者元數據不是component實例的固有屬性時。元數據可以表述ITask 執行的時間或者實現了ICommand的按鈕標題。

另外一些component可以使用通過Meta 使用元數據

 public class Log
{
    readonly IEnumerable<Meta<ILogAppender>> _appenders;

    public Log(IEnumerable<Meta<ILogAppender>> appenders)
    {
        _appenders = appenders;
    }

    public void Write(string destination, string message)
    {
         var appender = _appenders.First(a => a.Metadata["AppenderName"].Equals( destination));
        appender.Value.Write(message);
    }
}
 

可以像下面那樣通過使用 Meta<Lazy>或者the .NET 4 Lazy<T, TMetadata>,不創建component的也可以訪問元數據。

強類型的元數據

為了防止使用字符串來描述元數據,可以為每條元數據指定一個可讀的屬性,通過繼承IAppenderMetadata

 public interface IAppenderMetadata
{
        string AppenderName { get; }
}
 

在注冊時,可以使用WithMetadata 的重載方法去關聯值:

 builder.Register(c => new ScreenAppender())
.As<ILogAppender>().WithMetadata<IAppenderMetadata>(m =>  m.For(am => am.AppenderName, "screen"));
 

(這里有一個更高級的例子)

NET4.0中,autofac支持 Meta<T, TMetadata> System.Lazy<T, TMetadata> 沖強類型接口中讀取值。

 public class Log
{
        readonly IEnumerable<Lazy<ILogAppender, ILogAppenderMetadata>> _appenders;

        public Log(IEnumerable<Lazy<ILogAppender, ILogAppenderMetadata>> appenders)
        {
            _appenders = appenders;
        }

        public void Write(string destination, string message)
        {
            var appender = _appenders.First(a => a.Metadata.AppenderName == destination);
        appender.Value.Write(message);
        }
}
 

注意強類型屬性AppenderName的使用

 

注冊和使用元數據是分開的,所以你可以通過弱類型技術來使用強類型的元數據,反之亦然。

 

注意:Autofac1.4版本中, "extended properties"就是元數據,這個特征已經被元數據代替。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM