上記の私の質問はまだ有効ですが、とにかく以下があなたを助けるかもしれません。
Funqは自動コンストラクターインジェクション(別名自動配線)をサポートしていないため、Func<T>ラムダ式を作成して手動で行う必要があります。IDbConnectionFactoryコンストラクターの注入は既に手動で行っているため、サービスに注入するものを簡単に選択できます。例:
IDbConnectionFactory yellowDbConFactory =
new YellowDbConnectionFactory();
IDbConnectionFactory blueDbConFactory =
new BlueDbConnectionFactory();
IDbConnectionFactory purpleDbConFactory =
new PurpleDbConnectionFactory();
container.Register<IService1>(c =>
new Service1Impl(yellowDbConFactory,
c.Resolve<IDep1>());
container.Register<IService2>(c =>
new Service2Impl(blueDbConFactory);
container.Register<IService3>(c =>
new Service3Impl(purpleDbConFactory,
c.Resolve<IDep2>());
もちろん、次のような名前付き登録を使用することもできます。
container.Register<IDbConnectionFactory>("yellow",
new YellowDbConnectionFactory());
container.Register<IDbConnectionFactory>("blue",
new BlueDbConnectionFactory());
container.Register<IDbConnectionFactory>("purple",
new PurpleDbConnectionFactory());
container.Register<IService1>(c =>
new Service1Impl(
c.Resolve<IDbConnectionFactory>("yellow"),
c.Resolve<IDep1>());
container.Register<IService2>(c =>
new Service2Impl(
c.Resolve<IDbConnectionFactory>("blue"));
container.Register<IService3>(c =>
new Service3Impl(
c.Resolve<IDbConnectionFactory>("purple"),
c.Resolve<IDep2>());
自動配線のサポートがないため、これらのかなり厄介な登録になり、これはすぐに構成ルートのメンテナンスの悪夢になりますが、それはあなたの質問とは無関係です;-)
通常、登録のあいまいさを防ぐようにしてください。あなたの場合、2つのことを行う(2つのデータベースに接続する)単一のインターフェースがあります。両方のデータベースがまったく同じモデルを共有していない限り、各データベースは独自のインターフェイスに値します(2つの実装が交換可能でない場合、リスコフの置換原則に違反することになります)。
interface IYellowDbConnectionFactory : IDbConnectionFactory
{
}
interface IPurpleDbConnectionFactory : IDbConnectionFactory
{
}
ServiceStackの動作方法により、おそらくそれぞれに実装を実装する必要があります。
class YellowDbConnectionFactory : OrmLiteConnectionFactory,
IYellowDbConnectionFactory
{
public YellowDbConnectionFactory(string s) : base(s){}
}
class PurpleDbConnectionFactory : OrmLiteConnectionFactory,
IPurpleDbConnectionFactory
{
public YellowDbConnectionFactory(string s) : base(s){}
}
IDbConnectionFactoryここで、サービスの定義を変更して、 :を使用する代わりに特定のインターフェースを使用する必要があります。
public class MovieService : RestServiceBase<Movie>
{
private readonly IYellowDbConnectionFactory dbFactory;
public MovieService(IYellowDbConnectionFactory factory)
{
this.dbFactory = factory;
}
}
このクラスは、プロパティインジェクションの代わりにコンストラクタインジェクションを使用するようになっていることに注意してください。これをプロパティインジェクションで機能させることができますが、通常はコンストラクタインジェクションを使用することをお勧めします。これはそれについてのSOの質問です。
Funqを使用すると、構成は次のようになります。
container.Register<MovieService>(c =>
new MovieService(
c.Resolve<IYellowDbConnectionFactory>());
Funqは自動配線をサポートしていないため、これら2つの新しいインターフェイスと2つのクラスに変更してMovieServiceも、あまり効果はありませんでした。あなたはすべてを手動で一緒に配線している人になります。ただし、自動配線をサポートするフレームワークに切り替えると、何を注入するかについての議論がないため、この設計により、コンテナーは問題なく適切な依存関係を注入できます。