私のアプリケーションでは、クラス内の複数のリポジトリに依存関係を持ちたいと考えていますが、毎回すべてのリポジトリが必要になるわけではありません。不要な場合にそれぞれのインスタンスを作成するのではなく、WindsorのTyped Factory 機能を使用します。
ただ、リポジトリごとにファクトリを登録するのはちょっと面倒なので、これをオープンジェネリック登録に置き換えたいと思います。私がやりたいことは、次のようなものです。
container.Register(
Component.For<IFactory<IRepository<>>>().AsFactory()
);
ただし、これは IRepository の型パラメーターが欠落しているため、構文エラーです。これを機能させるために使用できる構文はありますか?
注: 型指定されていない Factory インターフェースを登録し、これを使用して複数のコンポーネントを作成できることは承知しています。これは本質的にサービスロケーターに依存しているため、これを行うことに興味はありません-依存関係を登録していない場合、コードがそれを使用しようとするまで、それについてはわかりません-私が知っている私のアプローチではまだインスタンスを作成していませんが、コンストラクターでこれを行います。
以下の完全な(簡略化された)サンプル:
public class TestA { }
public class TestB { }
public interface IRepository<T> { T Create(); }
public class Repository<T> : IRepository<T>
{
public T Create() { return Activator.CreateInstance<T>(); }
}
public interface IFactory<T>
{
T Create();
void Release(T instance);
}
class Program
{
static void Main(string[] args)
{
IWindsorContainer container = new WindsorContainer();
container.AddFacility<TypedFactoryFacility>();
container.Register(
// Individual registrations of repositories here are fine
Component.For<IRepository<TestA>>().ImplementedBy<Repository<TestA>>(),
Component.For<IRepository<TestB>>().ImplementedBy<Repository<TestB>>()
);
container.Register(
// Individual registrations of factories - works, but trying to avoid!
Component.For<IFactory<IRepository<TestA>>>().AsFactory(),
Component.For<IFactory<IRepository<TestB>>>().AsFactory()
);
container.Register(
// Generic Registration of Factories - syntax errors
// Component.For<IFactory<IRepository<>>>().AsFactory()
// Component.For(typeof(IFactory<IRepository<>>)).AsFactory()
);
var factoryA = container.Resolve<IFactory<IRepository<TestA>>>();
var factoryB = container.Resolve<IFactory<IRepository<TestB>>>();
var repoA = factoryA.Create();
var repoB = factoryB.Create();
Console.WriteLine("Everything worked");
}
}