私はUnityを使用して複数のデータベースを対象としたMike Hadlow's implementation of generic repositories(linqからsqlへのフレーバ)を解決しています。動作するコンテナの構成:ユニティコンストラクタインジェクションがレポジトリを期待どおりに解決しない
container.RegisterType<IConnectionStringProvider, HistoryConnectionProvider>(new TransientLifetimeManager())
.RegisterType<IConnectionStringProvider, MetaConnectionProvider>("meta", new TransientLifetimeManager())
.RegisterType<IDataContextProvider, DataContextProvider>(new TransientLifetimeManager())
.RegisterType<IDataContextProvider, DataContextProvider>("meta", new TransientLifetimeManager(), new InjectionConstructor(new ResolvedParameter<IConnectionStringProvider>("meta")))
// this registration of Repository<> resolves the history database by default
.RegisterType(typeof(IRepository<>), typeof(Repository<>), new TransientLifetimeManager());
// anything not targeting this database has to be declared
.RegisterType<IRepository<SpecificType>, Repository<SpecificType>>(new TransientLifetimeManager(), new InjectionConstructor(new ResolvedParameter<DataContextProvider>("meta")));
これは不必要に冗長なようです。私は現在、さまざまなアプローチを試みています。
IConnectionStringProvider historyConnectionProvider = new ConnectionProvider(connections.HistoryConnectionString);
IConnectionStringProvider metaConnectionProvider = new ConnectionProvider(connections.MetaConnectionString);
container.RegisterType<IDataContextProvider, DataContextProvider>("history", new TransientLifetimeManager(), new InjectionConstructor(historyConnectionProvider))
.RegisterType<IDataContextProvider, DataContextProvider>("meta", new TransientLifetimeManager(), new InjectionConstructor(metaConnectionProvider))
.RegisterType(typeof(IHistoryRepository<>), typeof(Repository<>), new TransientLifetimeManager(), new InjectionConstructor(new ResolvedParameter<IDataContextProvider>("history")))
.RegisterType(typeof(IMetaRepository<>), typeof(Repository<>), new TransientLifetimeManager(), new InjectionConstructor(new ResolvedParameter<IDataContextProvider>("meta")));
残念ながら、これは機能しません。結果は、IDataContextProviderの最後の型が登録されて、すべてのタイプのリポジトリに注入されることになります。助けを前にありがとう。
Hey Rob、レスポンスありがとうございます。メタデータベースを対象とする50のリポジトリを取得した後、ヒストリをターゲットに設定する際のデフォルトの動作に対する例外は、かなりの量のコードになります。毎回例外を作成するのではなく、IHistoryRepositoryを宣言してそのデータベースを対象とするレポを取得することが容易になりました。 IDataContextProvidersの名前を付ける限り、これらのIDataContextProvidersのライフタイムをコンテナ(最終的にWebリクエストごと)で処理するようにしたいので、登録する必要があると感じました。あなたは違いがないということは間違いありません。 –