我将TypeFactoryFacility与通用工厂一起使用,以避免容器在需要之前实例化组件。通用工厂看起来像这样:
public interface IGenericFactory<T> {
T Create();
void Release(T dummyComponent);
}
后来我以下列方式使用它:
container.Register(
Component.For<IGenericFactory<IUtilityService>>().AsFactory());
container.Register(
Component.For<IUtilityService>().ImplementedBy<UtilityService>()
.OnCreate(WireUpAttibutes).LifeStyle.PerWebRequest);
然后我使用IGenericFactory<IUtilityService>
作为构造函数参数,并在需要使用该组件时调用Create()
。在我正在处理的Web应用程序的上下文中,将UtilityService绑定到Web请求非常重要(这就是它在LifeStyle.PerWebRequest
注册的原因)
当我查看容器调试器视图“潜在的生活方式不匹配”时,我收到一条消息:
具有生活方式Singleton *的组件'IGenericFactory' 取决于'TypedFactoryInterceptor'与生活方式瞬态这个 通常不需要那种依赖性,并可能导致各种各样的依赖 各种各样的错误。
如果我注册通用工厂:
container.Register(Component.For<IGenericFactory<IUtilityService>>()
.AsFactory().LifestylePerWebRequest());
然后消息消失了,但我想知道我是否输了,因为现在Windsor将为每个网络请求创建一个工厂。这比解决IUtilityService便宜,但只需要使用单件工厂就好了,因为这个工厂没有任何依赖。 (由我创建)
注册组件是一个问题吗? 工厂是否会根据Web请求解析组件IUtilityService?