Касл Виндзор: Как добавить вызов на заводе, а не в XML? - PullRequest
1 голос
/ 15 сентября 2008

Я знаю, как сказать Castle Windsor разрешить ссылку из фабричного метода с использованием XML, но могу ли я сделать это программно через интерфейс Container.AddComponent ()? Если нет, то есть ли другой способ сделать это из кода?

EDIT: Кажется, есть некоторая путаница, поэтому позвольте мне уточнить, я ищу способ сделать следующее в коде:

<facilities>
   <facility
        id="factory.support"
        type="Castle.Facilities.FactorySupport.FactorySupportFacility, Castle.MicroKernel"
    />

</facilities>

<components>

    <component
        id="CustomerRepositoryFactory"
        type="ConsoleApplication2.CustomerRepositoryFactory, ConsoleApplication2"
    />

    <component
        id="CustomerRepository"
        service="ConsoleApplication2.ICustomerRepository, ConsoleApplication2"
        type="ConsoleApplication2.CustomerRepository, ConsoleApplication2"
        factoryId="CustomerRepositoryFactory"
        factoryCreate="Create"
    />

</components>

( из этой статьи, посвященной поддержке кодов, о заводской поддержке в windsor и spring.net )

1 Ответ

3 голосов
/ 15 сентября 2008

Непосредственно из Unit Test FactorySupportTestCase (которые являются вашими друзьями):

[Test]
    public void FactorySupport_UsingProxiedFactory_WorksFine()
    {
        container.AddFacility("factories", new FactorySupportFacility());
        container.AddComponent("standard.interceptor", typeof(StandardInterceptor));
        container.AddComponent("factory", typeof(CalulcatorFactory));

        AddComponent("calculator", typeof(ICalcService), typeof(CalculatorService), "Create");

        ICalcService service = (ICalcService) container["calculator"];

        Assert.IsNotNull(service);
    }

    private void AddComponent(string key, Type service, Type type, string factoryMethod)
    {
        MutableConfiguration config = new MutableConfiguration(key);
        config.Attributes["factoryId"] = "factory";
        config.Attributes["factoryCreate"] = factoryMethod;
        container.Kernel.ConfigurationStore.AddComponentConfiguration(key, config);
        container.Kernel.AddComponent(key, service, type);
    }
...