假设我们在MVC中有一个控制器,就像这样:
public class HomeController : Controller
{
IProductService _productService;
ICategoryService _categoryService;
IUnitOfWork _uow;
public HomeController(IUnitOfWork uow, IProductService productService, ICategoryService categoryService)
{
_productService = productService;
_categoryService = categoryService;
_uow = uow;
}
// ...
}
我们使用StructureMap进行依赖注入,现在在Global..asax.cs中我们有一个类似的代码:
...
ObjectFactory.Initialize(x =>
{
x.For<IUnitOfWork>().HttpContextScoped().Use(() => new EFCodeFirstContext());
x.ForRequestedType<ICategoryService>().TheDefaultIsConcreteType<EfCategoryService>();
x.ForRequestedType<IProductService>().TheDefaultIsConcreteType<EfProductService>();
});
...
例如,什么时候创建EfCategoryService实例并将其分配给_categoryService?
1-我们在此控制器的任何方法中使用_categoryService吗?
或
2 - 当向该控制器发出请求时立即发出?例如,
www.sitename.com/Home
或
www.sitename.com/Home/News
答案 0 :(得分:1)
您应该让ASP .NET MVC知道您正在使用StructureMap进行依赖注入。
您可以通过提供IControllerFactory
在布线之前(在程序开始时)使用此代码 -
ControllerBuilder.Current.SetControllerFactory(new StractureMapControllerFactory());
StructureMapControllerFactory
将在实例化控制器时提供使用DI容器的实现
我从未使用StructureMap完成它,但我想有人已经为StructureMap实现了ContorllerFactory。