0

これは、ServiceStack.net で Funq を使用して複数の IDbConnectionFactory インスタンスを登録する方法からの質問の続きです。

私は同じことをする必要があります(1つのサービスが異なるdb接続にアクセスするようにします)-しかし、上記のstackoverflowの議論に対する答えは私にとって完全には意味がありません(そしてSOはコメントを追加さ​​せません)。

IDbConnectionFactory (OrmLiteConnectionFactory) などの依存クラスの実装をサービスごとに複数回使用できないということですか? 複数を使用する必要がある場合は、新しい実装を作成する必要があります (一意のクラス名を取得する以外の理由はありません)。

私は、(container.Register メソッドの) name パラメーターが (同じクラスの追加のインスタンスを識別するための) 目的であることを望んでいました。たとえば、次のようなものがあれば便利です: container.Register("Db_1", c => new OrmLiteConnectionFactory(connString1, SqlServerOrmLiteDialectProvider.Instance)); container.Register("Db_2", c => new OrmLiteConnectionFactory(connString2, SqlServerOrmLiteDialectProvider.Instance)); 次に、サービス内の各接続を次のように使用します: Db["DB_1"].Select... Db["DB_2"].Select または Db_1.Select.. Db_2.Select...

私を怠け者と呼んでください。しかし、新しい型名を取得する以外の目的でクラスを作成することは (追加のプロパティ/メソッドなしで 100% 継承するため)、冗長に思えます。

IoC/DI のいくつかの重要なポイントが欠けていると思いますので、誰かが私をまっすぐに設定していただければ幸いです。

ありがとうティム

4

1 に答える 1

2

この場合の名前付きインスタンスは、多くの人がアンチパターンと見なしているサービス ロケーター パターンに使用されていると思います。

たとえば、次のように名前付きインスタンスを使用できます。

container.Register<IDbConnectionFactory>("Db_1", c => new OrmLiteConnectionFactory(connString1, SqlServerOrmLiteDialectProvider.Instance));
container.Register<IDbConnectionFactory>("Db_2", c => new OrmLiteConnectionFactory(connString1, SqlServerOrmLiteDialectProvider.Instance));

次に、次のようなことを行うことができます(ただし、すべきではありません):

public void GetData() 
{
    var factory1 = container.TryResolveNamed<IDbConnectionFactory>("Db_1");
    var factory2 = container.TryResolveNamed<IDbConnectionFactory>("Db_2");

    ...
}

Service Locator パターンを使用すべきでない理由について、Mark Seemann が素晴らしい記事を書いています。

名前付きインスタンスでは、消費者が何が注入されているかについての知識を必要とすることを避ける方法がわかりません。

于 2013-10-11T02:51:44.270 に答える