Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DefaultControllerFactory和GetControllerInstance的主要功能是什么?_C#_Asp.net Mvc 3_Ninject - Fatal编程技术网

C# DefaultControllerFactory和GetControllerInstance的主要功能是什么?

C# 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阅读了下面的文章,但它非常基本。下面的例子更复杂,所以如果

我正在学习MVC3,正在阅读pro asp.net MVC3 framework一书。我已经阅读了一些关于DefaultControllerFactory的文章,以及关于如何使用ninject作为de DI的文章。DefaultControllerFactory正在创建一个将使用ninject的新控制器,对吗?这是否意味着每次调用新控制器(如ProductController:controller)时都会调用此新控制器

我为ninject阅读了下面的文章,但它非常基本。下面的例子更复杂,所以如果有人能解释一下,那将非常有帮助!提前非常感谢你,我希望这也能帮助其他人

对于DefaultControllerFactory:

Product.cs

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()); ;
    }