AutoFacドキュメント11

6058 ワード

目次
  • から
  • Registering components
  • 制御範囲とライフサイクル
  • 用モジュール構造化Autofac
  • xml構成
  • と.Net統合
  • Autofac
  • を深く理解する
  • 指導
  • について
  • 用語集
  • メタデータ
    Autofacは、componentのメタデータを作成および使用するメカニズムを提供します.
    Managed Extensibility Framework(MEF)に詳しい場合は、componentメタデータの例を見たことがあるかもしれません.
    メタデータはcomponentのこのcomponentに関する情報を格納し、インスタンスを作成する必要がなくてもアクセスできます.
    登録時にメタデータを追加
    値記述メタデータは、登録フェーズでcomponentに関連付けられ、各メタデータはキー値ペアです.
    ?
    1
    2
    3 builder.Register(c => new ScreenAppender()) .As<ILogAppender>()   .WithMetadata( "AppenderName" , "screen" );
    XMLファイルでは
    ?
    1
    2
    3
    4
    5
    6
    7 <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から1つを選択する場合に便利であるか、メタデータがcomponentインスタンスの固有の属性ではない場合に便利になります.メタデータは、ITaskが実行した時間を記述したり、ICommandのボタンタイトルを実現したりすることができる.
    他のcomponentではMetaでメタデータを使用できます
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15 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またはtheを用いることができる.NET 4 Lazyは、componentを作成しなくてもメタデータにアクセスできます.
    強いタイプのメタデータ
    文字列を使用してメタデータを記述しないようにするには、IAppenderMetadataを継承することによって、メタデータごとに読み取り可能な属性を指定します.
    ?
    1
    2
    3
    4 public interface IAppenderMetadata {          string AppenderName { get ; } }
    登録時にWithMetadataのリロードメソッドを使用して値を関連付けることができます.
    ?
    1
    2 builder.Register(c => new ScreenAppender()) .As<ILogAppender>().WithMetadata<IAppenderMetadata>(m =>  m.For(am => am.AppenderName, "screen" ));
    (ここにはより高度な例がある)
    NET 4です.0ではautofacはMetaおよびSystemをサポートする.Lazyパンチタイプインタフェースで値を読み出します.
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15 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の使用
     
    メタデータの登録と使用は別々なので、弱いタイプの技術で強いタイプのメタデータを使用することができます.逆も同様です.
     
    注意:Autofac 1.4バージョンでは、「extended properties」がメタデータであり、この特徴はメタデータに置き換えられています.