AutoFac文檔
目錄
- 開始
- Registering components
- 控制范圍和生命周期
- 用模塊結構化Autofac
- xml配置
- 與.net集成
- 深入理解Autofac
- 指導
- 關於
- 詞匯表
元數據
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"就是元數據,這個特征已經被元數據代替。