城堡工厂为短生活依赖

时间:2012-03-30 15:58:30

标签: dependency-injection inversion-of-control castle-windsor factory

我需要我的单件服务依赖于每个Web请求对象,我想使用Castle的TypedFactoryFacility为我的对象自动创建工厂。

我的注册如下:

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

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

我还在web.xml中注册了每个Web请求的生命周期,工厂界面如下所示:

    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 个答案:

答案 0 :(得分:1)

我终于找到了我所缺少的东西。我正在使用具有默认实现的Micro内核:

IKernel kernel = new DefaultKernel();

缺少动态代理支持。有两种解决方案,要么坚持使用微内核并添加动态代理工厂依赖性:

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

或切换到Castle Windsor Container

答案 1 :(得分:0)

不是为要实例化的每种类型创建特定工厂(例如,您的IMailMessageQueueProvider),而是一种更流畅的方法可能是创建一个通用工厂: -

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

以通常的方式将其注册到温莎: -

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

将IServiceFactory注入要进行实例化的类中,然后调用Create方法。例如。

var queue = _factory.Create<IMailMessageQueue>();