在我的应用程序中,我想依赖于一个类中的多个存储库,并不是每次都需要它们。我没有在不必要的地方为每个实例构建一个实例,而是使用 Windsor 中的Typed Factory 工具。
但是,为每个存储库注册一个工厂有点烦人,我想用一个开放的通用注册来代替它。我想做的是如下所示:
container.Register(
Component.For<IFactory<IRepository<>>>().AsFactory()
);
但是,这是一个语法错误,因为 IRepository 缺少类型参数。有没有我可以使用的语法来完成这项工作?
注意:我知道我可以注册一个无类型的工厂接口并使用它来创建多个组件。我对此不感兴趣,因为这本质上是对服务定位器的依赖——如果我没有注册依赖,那么在代码尝试使用它之前我不会知道它——用我知道的方法this 在构造函数中,即使我还没有创建实例。
完整(简化)示例如下:
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");
}
}