使用TypedFactoryFacility错误
本文关键字:错误 TypedFactoryFacility 使用 | 更新日期: 2023-09-27 18:25:54
我在IoC容器中安装了以下工厂:
// Factory for late-binding scenarios
container.AddFacility<TypedFactoryFacility>();
container.Register(
Component
.For<IServiceFactory>()
.AsFactory()
);
其中IServiceFactory
为:
public interface IServiceFactory
{
T Create<T>();
void Release(object service);
}
然后我的控制器看起来像这样:
public class PostsController : BaseController
{
private readonly IServiceFactory serviceFactory;
private LinkService linkService
{
get { return serviceFactory.Create<LinkService>(); }
}
public PostsController(IServiceFactory serviceFactory)
{
if (serviceFactory == null)
{
throw new ArgumentNullException("serviceFactory");
}
this.serviceFactory = serviceFactory;
}
关键是,即使LinkService
有PerWebRequest
的生活方式,我也可能并不总是需要它,因此,直接注射它对我来说似乎是错误的。
不过,现在脑海中浮现的问题是:我是否在这里使用容器作为服务定位器?
如果T
是无界的,在这种情况下就是无界的。您正在将要创建的类型的知识放入接收类中。这个配置最好留给负责设置容器的类。在Castle 3.0中,您可以选择使用Lazy<T>
来推迟分辨率,这在这里很容易做到:
public PostsController(Lazy<ILinkService> linkService)
{
if (linkService == null)
{
throw new ArgumentNullException("linkService");
}
this.linkService = linkService;
}
是的,您正在将容器用作服务定位器。