C# DefaultControllerFactory和GetControllerInstance的主要功能是什么?
我正在学习MVC3,正在阅读pro asp.net MVC3 framework一书。我已经阅读了一些关于DefaultControllerFactory的文章,以及关于如何使用ninject作为de DI的文章。DefaultControllerFactory正在创建一个将使用ninject的新控制器,对吗?这是否意味着每次调用新控制器(如ProductController:controller)时都会调用此新控制器 我为ninject阅读了下面的文章,但它非常基本。下面的例子更复杂,所以如果有人能解释一下,那将非常有帮助!提前非常感谢你,我希望这也能帮助其他人 对于DefaultControllerFactory: Product.csC# DefaultControllerFactory和GetControllerInstance的主要功能是什么?,c#,asp.net-mvc-3,ninject,C#,Asp.net Mvc 3,Ninject,我正在学习MVC3,正在阅读pro asp.net MVC3 framework一书。我已经阅读了一些关于DefaultControllerFactory的文章,以及关于如何使用ninject作为de DI的文章。DefaultControllerFactory正在创建一个将使用ninject的新控制器,对吗?这是否意味着每次调用新控制器(如ProductController:controller)时都会调用此新控制器 我为ninject阅读了下面的文章,但它非常基本。下面的例子更复杂,所以如果
namespace SportsStore3.WebUI.Controllers
{
public class ProductController : Controller
{
private IProductsRepository repository;
public ProductController(IProductsRepository productRepository)
{
repository = productRepository;
}
}
Infrastructure.cs
namespace SportsStore3.WebUI.Infrastructure
{
public class Infrastructure
{
public class NinjectControllerFactory : DefaultControllerFactory
{
private IKernel ninjectKernel;
public NinjectControllerFactory()
{
ninjectKernel = new StandardKernel();
AddBindings();
}
protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
return controllerType == null
? null
: (IController)ninjectKernel.Get(controllerType);
}
private void AddBindings()
{
ninjectKernel.Bind<SportsStore3.Domain.Abstract.IProductsRepository>().To<EFProductRepository>();
}
}
}
}
Global.asax.cs
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
ControllerBuilder.Current.SetControllerFactory(new SportsStore3.WebUI.Infrastructure.Infrastructure.NinjectControllerFactory()); ;
}
我不想麻烦,我假设最新和未来的版本,框架使用IDependencyResolver,因此不再需要这样的实现和连接。自MVC3以来,情况发生了很大变化,尽管有些人仍然喜欢覆盖DefaultControllerFactory,大多数人使用IDependencyResolver的内置DI集成点,不再需要这样做。除此之外,您不需要做旧的Ninject文章中说您必须做的许多事情,例如派生新的HttpApplication对象。虽然阅读这些东西很好,但要意识到它已经过时了,并将其作为学习的基础,然后从中寻找更新的材料。Mxmissile和Erik比你更了解答案,我会找到关于新技术的新文章。Erik当您使用IDependecy解析器时,这意味着这将是您的DI,或者即使在使用IDEPendecyResolver时,您仍然需要使用ninject吗
namespace SportsStore3.Domain.Abstract
{
public interface IProductsRepository
{
IQueryable<Product> Products { get; }
}
}
namespace SportsStore3.Domain
{
public class Product
{
public int ProductID {get; set;}
public string Name { get; set; }
}
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
ControllerBuilder.Current.SetControllerFactory(new SportsStore3.WebUI.Infrastructure.Infrastructure.NinjectControllerFactory()); ;
}