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