![](/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.