使用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;
    }

关键是,即使LinkServicePerWebRequest的生活方式,我也可能并不总是需要它,因此,直接注射它对我来说似乎是错误的。

不过,现在脑海中浮现的问题是:我是否在这里使用容器作为服务定位器?

使用TypedFactoryFacility错误

如果T是无界的,在这种情况下就是无界的。您正在将要创建的类型的知识放入接收类中。这个配置最好留给负责设置容器的类。在Castle 3.0中,您可以选择使用Lazy<T>来推迟分辨率,这在这里很容易做到:

 public PostsController(Lazy<ILinkService> linkService) 
 { 
     if (linkService == null) 
     { 
         throw new ArgumentNullException("linkService"); 
     } 
     this.linkService = linkService; 
 } 

是的,您正在将容器用作服务定位器。