簡體   English   中英

溫莎城堡:如何注入所有工廠的藏品?

[英]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來解析具有單個生命周期的動物的集合 但是在下面的示例中,您似乎無法結合TypedFactoryFacilityCollectionResolver的效果來解析工廠集合。

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.

您必須執行以下步驟:

  1. 將接口注冊為工廠,並選擇適合您需求的使用壽命。 該接口沒有實現,因為它是城堡類型的工廠設施。 我將此類提供者注冊為singletons:

    Component.For()。AsFactory()

我故意將其命名為provider,因為它不會通過某些邏輯創建新實例,但會為您提供已注冊的實例。

  1. 接口必須如下所示:

    公共接口IAnimalFactoryProvider {IEnumerable <IAnimalFactory> GetAllAnimalFactories(); void Release(IAnimalFactory animalFactory); }

  2. 然后,將IModuleModelInitializerProvider放入要注入的ctor中,然后通過方法GetAllAnimalFactories()獲取所有hte實例。

  3. 然后,根據您的IAnimal工廠,您可以在使用后釋放它們,或者如果它們也是單例的,您也可以離開它們,Castle會在您的應用程序退出時對其進行處理。

這里這里這里這里這里描述另一個方法類型的工廠作為委托

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM