我需要我的单件服务依赖于每个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
答案 0 :(得分:1)
我终于找到了我所缺少的东西。我正在使用具有默认实现的Micro内核:
IKernel kernel = new DefaultKernel();
缺少动态代理支持。有两种解决方案,要么坚持使用微内核并添加动态代理工厂依赖性:
IKernel kernel = new DefaultKernel(new DefaultProxyFactory());
答案 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>();