我在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
生活方式,我也可能并不总是需要它,因此,直接注射它似乎对我不利。
但是,现在想到的问题是:我在这里使用容器作为服务定位器吗?
答案 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)