使用TypedFactoryFacility错了吗?

时间:2012-02-27 19:54:42

标签: c# model-view-controller inversion-of-control castle-windsor

我在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生活方式,我也可能并不总是需要它,因此,直接注射它似乎对我不利。

但是,现在想到的问题是:我在这里使用容器作为服务定位器吗?

2 个答案:

答案 0 :(得分:4)

如果T无界限,那么就是这种情况。您将在接收类中创建要创建的类型的知识。此配置最好留给负责设置容器的类。在Castle 3.0中,您可以选择使用Lazy<T>来推迟解析,这可以在这里轻松完成:

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

     this.linkService = linkService; 
 } 

答案 1 :(得分:2)