Замковая фабрика для кратковременного проживания - PullRequest
0 голосов
/ 30 марта 2012

Мне нужно, чтобы мой одноэлементный сервис зависел от объекта веб-запроса, и я хотел бы использовать Castle TypedFactoryFacility для автоматического создания фабрики для моих объектов.

Моя регистрация выглядит так:

        kernel.AddFacility<TypedFactoryFacility>();
        kernel.Register(
            Component.For<IMailMessageQueueProvider>()
                .AsFactory()
            );

        kernel.Register(
            Component.For<IMailMessageQueue>()
                .ImplementedBy<MailMessageQueue>()
                .LifeStyle.PerWebRequest
            );

Я также зарегистрировал время жизни веб-запроса в web.xml, интерфейс фабрики выглядит так:

    public interface IMailMessageQueueProvider
    {
        IMailMessageQueue Get();
    }

И я получаю эту приятную ошибку:

Type Model.IMailMessageQueueProvider is abstract.
As such, it is not possible to instansiate it as implementation of service        
Model.IMailMessageQueueProvider.

Почему Castleне создаете фабрики?

это ссылка, которой я следовал: http://stw.castleproject.org/Windsor.Typed-Factory-Facility-interface-based-factories.ashx

Ответы [ 2 ]

1 голос
/ 02 апреля 2012

В конце концов я нашел то, что мне не хватало. Я использовал Micro ядро ​​с реализацией по умолчанию:

IKernel kernel = new DefaultKernel();

, в котором отсутствовала поддержка динамического прокси. Существует два решения: либо придерживаться микроядра, либо добавить динамическую зависимость фабрики прокси:

IKernel kernel = new DefaultKernel(new DefaultProxyFactory());

или переключитесь на Castle Windsor Container .

0 голосов
/ 11 апреля 2012

Вместо того, чтобы создавать конкретную фабрику (например, IMailMessageQueueProvider) для каждого типа, для которого вы хотите создать экземпляр, более подходящим может быть создание одной универсальной фабрики: -

public interface IServiceFactory
{
    T Create<T>();
    void Release(object service);
}

Зарегистрируйте его в Виндзоре обычным способом: -

container.Register(Component.For<IServiceFactory>().AsFactory());

Внедрите IServiceFactory в класс, в котором вы хотите создать экземпляр, а затем вызовите метод Create. Например.

var queue = _factory.Create<IMailMessageQueue>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...