繁体   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