![](/img/trans.png)
[英]Castle Windsor: How do I inject all implementations of interface into a ctor?
[英]Castle Windsor: How to inject the collection of all factories?
我想使用Castle Windsor获得实现特定接口的所有工厂的集合。
假设您具有以下类型层次结构:
public interface IAnimal { }
public class Cat : IAnimal { }
public class Dog : IAnimal { }
使用TypedFactoryFacility
我可以注入一个Func<IAnimal>
,它充当创建动物实例(具有瞬态生命周期)的工厂 。 我还可以使用CollectionResolver
来解析具有单个生命周期的动物的集合 。 但是在下面的示例中,您似乎无法结合TypedFactoryFacility
和CollectionResolver
的效果来解析工厂集合。
public class Zoo
{
public Zoo(IEnumerable<Func<IAnimal>> animalFactories)
{
foreach (Func<IAnimal> factory in animalFactories)
{
IAnimal animal = factory();
Console.WriteLine(animal.GetType());
}
}
}
class Test
{
static void Main(string[] args)
{
IWindsorContainer container = new WindsorContainer();
container.AddFacility<TypedFactoryFacility>();
container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel));
container.Register(Component.For<IAnimal>().ImplementedBy<Cat>().LifestyleTransient());
container.Register(Component.For<IAnimal>().ImplementedBy<Dog>().LifestyleTransient());
container.Register(Component.For<Zoo>());
container.ResolveAll<IAnimal>();
container.Resolve<Zoo>();
}
}
这将导致以下错误:
Component Zoo has a dependency on System.Collections.Generic.IEnumerable`1[System.Func`1[IAnimal]], which could not be resolved.
您必须执行以下步骤:
将接口注册为工厂,并选择适合您需求的使用寿命。 该接口没有实现,因为它是城堡类型的工厂设施。 我将此类提供者注册为singletons:
Component.For()。AsFactory()
我故意将其命名为provider,因为它不会通过某些逻辑创建新实例,但会为您提供已注册的实例。
接口必须如下所示:
公共接口IAnimalFactoryProvider {IEnumerable <IAnimalFactory> GetAllAnimalFactories(); void Release(IAnimalFactory animalFactory); }
然后,将IModuleModelInitializerProvider放入要注入的ctor中,然后通过方法GetAllAnimalFactories()获取所有hte实例。
然后,根据您的IAnimal工厂,您可以在使用后释放它们,或者如果它们也是单例的,您也可以离开它们,Castle会在您的应用程序退出时对其进行处理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.