4

Autofacを使用しています。コンストラクターパラメーターに適用する属性に基づいて、依存関係の異なる実装を注入したいと思います。例えば:

class CustomerRepository
{
    public CustomerRepository([CustomerDB] IObjectContainer db) { ... }
}

class FooRepository
{
    public FooRepository([FooDB] IObjectContainer db) { ... }
}

builder.Register(c => /* return different instance based on attribute on the parameter */)
       .As<IObjectContainer>();

属性は、接続文字列などのデータを提供します。これを使用して、正しいオブジェクトをインスタンス化できます。

これどうやってするの?

4

2 に答える 2

9

IObjectContainertoCustomerRepositoryとのさまざまな実装を提供したいようですFooRepository。その場合、属性は薄い金属製の定規である可能性があります。代わりに、Autofacを使用して複数の実装を実装する方法を紹介します。

(簡潔にするために、などの呼び出しは省略され.ContainerScoped()ています。)

IObjectContainerまず、登録に名前を付けて、接続文字列ごとにのバージョンを登録します。

builder
    .Register(c => new ObjectContainer(ConnectionStrings.CustomerDB))
    .As<IObjectContainer>()
    .Named("CustomerObjectContainer");

builder
    .Register(c => new ObjectContainer(ConnectionStrings.FooDB))
    .As<IObjectContainer>()
    .Named("FooObjectContainer");

次に、リポジトリ登録の特定のインスタンスを解決します。

builder.Register(c => new CustomerRepository(
    c.Resolve<IObjectContainer>("CustomerObjectContainer"));

builder.Register(c => new FooRepository(
    c.Resolve<IObjectContainer>("FooObjectContainer"));

これにより、リポジトリに構成情報がなくなります。

class CustomerRepository
{
    public CustomerRepository(IObjectContainer db) { ... }
}

class FooRepository
{
    public FooRepository(IObjectContainer db) { ... }
}
于 2010-03-21T04:50:07.407 に答える
0

いくつかのリポジトリがあり、コンストラクターパラメータがほとんどない場合、ブライアンの答えは十分です。しかし、それらがたくさんある場合、ルートを設定することは困難です。これは、インターフェースの解決時にクラスのメタデータをスキャンすることで実現できます。そのパラメータに関する情報を取得すると、実際の実装を解決できます。ここで私の答えを参照してください。

于 2013-09-28T12:55:30.990 に答える