ÔÚ[ASP.NET MVC Сţ֮·]ϵÁÐÉÏһƪÎÄÕ£¨ÒÀÀµ×¢Èë(DI)ºÍNinject£©µÄĩβÌáµ½ÁËÔÚASP.NET MVCÖÐʹÓÃNinjectÒª×öµÄÁ½¼þÊÂÇé£¬ÐøÕâÆªÎÄÕÂÖ®ºó£¬±¾ÎĽ«ÓÃÒ»¸öʵ¼ÊµÄʾÀýÀ´ÑÝʾNinjectÔÚASP.NET MVCÖеÄÓ¦Óá£
ΪÁ˸üºÃµÄÀí½âºÍ³ÅÎÕ±¾ÎÄÄÚÈÝ£¬Ç¿ÁÒ½¨Òé³õѧÕßÔĶÁ±¾ÎÄǰÏÈÔĶÁÒÀÀµ×¢Èë(DI)ºÍNinject¡£
±¾ÎÄĿ¼£º
×¼±¸¹¤×÷
н¨Ò»¸öÃûΪBookShopµÄ¿Õ°×½â¾ö·½°¸¡£Ôڸýâ¾ö·½°¸ÖзֱðÌí¼ÓÒ»¸öÃûΪBookShop.WebUIµÄMVC¿ÕÓ¦ÓóÌÐò£¬ºÍÒ»¸öÃûΪBookShop.DomainµÄÀà¿â¹¤³Ì¡£Ä¿Â¼½á¹¹ÈçÏ£º
Á½¸ö¹¤³ÌÌí¼ÓÍêºó£¬ÔÚBookShop.WebUI¹¤³ÌÏÂÌí¼ÓBookShop.Domain¹¤³ÌµÄÒýÓá£
ʹÓÃNuGet·Ö±ðΪBookShop.WebUI¹¤³ÌºÍBookShop.Domain¹¤³Ì°²×°Ninject°ü£¨NuGetµÄ½éÉÜÇëÔĶÁÒÀÀµ×¢Èë(DI)ºÍNinject£©¡£¿ÉÒÔͨ¹ý¿ÉÊÓ»¯´°¿Ú°²×°£¬Ò²¿ÉÒÔ´ò¿ªPackage Manager Console£¨ÊÓͼ->ÆäËû´°¿Ú->Package Manager Console£©Ö´ÐÐÏÂÃæÃüÁî°²×°£º
Install-Package Ninject -Project BookShop.WebUI
Install-Package Ninject -Project BookShop.Domain
ÏÂͼ˵Ã÷°²×°³É¹¦£º
´´½¨Controller Factory
ÎÒÃÇÖªµÀ£¬ÔÚASP.NET MVCÖУ¬Ò»¸ö¿Í»§¶ËÇëÇóÊÇÔÚÌØ¶¨ControllerµÄActionÖнøÐд¦ÀíµÄ¡£ ĬÈÏÇé¿öÏ£¬ASP.NET MVCʹÓÃÄÚÖõÄController¹¤³§Àà DefaultControllerFactoryÀ´´´½¨Ä³¸öÇëÇó¶ÔÓ¦µÄControllerʵÀý¡£ÓÐʱºòĬÈϵÄController¹¤³§²»ÄÜÂú×ãÎÒÃÇʵ¼ÊµÄÐèÇó£¬ÎÒÃǾÍÐèÒª¶ÔÕâÖÖĬÈÏÐÐΪ½øÐÐÀ©Õ¹£¬¼´´´½¨Ò»¸ö¼Ì³Ð×ÔDefaultControllerFactoryÀàµÄ×Ô¶¨ÒåController¹¤³§Àà²¢ÖØÐ´ÆäÖеÄһЩ·½·¨¡£Îª´Ë£¬ÎÒÃÇÔÚBookShop.WebUI¹¤³ÌÏ´´½¨Ò»¸öÃûΪInfrastructureµÄÎļþ¼Ð£¬ÔÚ¸ÃÎļþ¼ÐÖÐÌí¼ÓÒ»¸öÃûΪNinjectControllerFactoryµÄ¹¤³§À࣬´úÂëÈçÏ£º
public class NinjectControllerFactory : DefaultControllerFactory { ???private IKernel ninjectKernel; ???public NinjectControllerFactory() { ???????ninjectKernel = new StandardKernel(); ???????AddBindings(); ???} ???protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) { ???????return controllerType == null ? null : (IController)ninjectKernel.Get(controllerType); ???} ???private void AddBindings() { ???????// todo:ºóÃæÔÙÀ´Ìí¼Ó°ó¶¨ ???}}
ÉÏÃæ´úÂëÖÐµÄ ninjectKernel.Get(controllerType) ¿É»ñÈ¡µ½Ò»¸öControllerʵÀý¡£ÔÚÕâÀïÈç¹ûÊÖ¶¯ÊµÀý»¯ControllerÀàÊÇÒ»¸ö·Ç³£¸´ÔӵĹý³Ì£¬ÎÒÃDz»ÖªµÀControllerÀàÓÐûÓдø²ÎÊýµÄ¹¹Ô캯Êý£¬Ò²²»ÖªµÀ¹¹Ô캯ÊýµÄ²ÎÊýÊÇʲôÀàÐÍ¡£¶øÊ¹ÓÃNinjectÖ»ÐèҪʹÓÃÉÏÃæµÄÒ»¸öGet·½·¨¾Í¿ÉÒÔ£¬NinjectÄÚ²¿»á×Ô¶¯´¦ÀíËùÓеÄÒÀÀµ¹ØÏµ£¬ÖÇÄܵش´½¨ÎÒÃÇÐèÒªµÄ¶ÔÏó¡£
Controller¹¤³§Àà´´½¨ºÃºó£¬ÎÒÃǾÍÐèÒª¸æËßMVCÓÃÎÒÃǵÄNinjectControllerFactoryÀàÀ´´´½¨Controller¶ÔÏó£¬Îª´Ë£¬ÐèÔÚGlobal.asaxÎļþµÄApplication_Start·½·¨ÖÐÌí¼ÓÏÂÃæ´úÂ룺
protected void Application_Start() { ???...... ???//ÉèÖÃController¹¤³§ ???ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());}
ÕâÀïÎÒÃÇÔÝÇÒ²»È¥¹ØÐÄÉÏÃæÕâ¶Î´úÂëÊÇʲôÔÀí£¬ÖªµÀÉèÖÃ×Ô¶¨ÒåµÄController¹¤³§±ØÐëÒªÔÚÕâ×¢²á¾ÍÐÐÁË£¬ÓпյϰÎÒ»áÔÚºóÐø²©ÎĶÔÕⲿ·ÖÄÚÈݽøÐиüÉîÈëµÄ½²½â¡£
Ìí¼ÓDomain Model
ÔÚMVCÓ¦ÓóÌÐòÖУ¬Ò»Çж¼ÊÇÎ§ÈÆDomain Model£¨ÁìÓòÄ£ÐÍ£©À´µÄ¡£ ËùÒÔÎÒÃÇÔÚBookShop.Domain¹¤³ÌÖÐרÃŽ¨Ò»¸öÃûΪEntitiesµÄÎļþ¼Ð£¬ÓÃÀ´´æ·ÅÁìÓòʵÌåÄ£ÐÍ¡£×÷Ϊһ¸öµç×ÓÉÌÎñÀàµÄÍøÉÏÊéµê£¬µ±È»×îÖØÒªµÄÒ»¸öÁìÓòʵÌå¾ÍÊÇBookÁË¡£ÓÉÓÚÖ»ÊÇΪÁËÑÝʾ£¬ÎÒÃǼòµ¥¶¨ÒåÒ»¸öBookÀ࣬²¢ÔÚEntitiesÎļþ¼ÐÖÐÌí¼Ó¸ÃÀ࣬´úÂëÈçÏ£º
public class Book { ???public int ID { get; set; } ???public string Title { get; set; } ???public string Isbn { get; set; } ???public string Summary { get; set; } ???public string Author { get; set; } ???public byte[] Thumbnail { get; set; } ???public decimal Price { get; set; } ???public DateTime Published { get; set; }}
Ìí¼ÓRepository
ÎÒÃÇÖªµÀ£¬ÎÒÃǿ϶¨ÐèÒªÒ»ÖÖ·½Ê½À´´ÓÊý¾Ý¿âÖжÁÈ¡BookÊý¾Ý¡£ÔÚÕâÎÒÃDz»·ÀΪÊý¾ÝµÄʹÓÃÕߣ¨ÕâÀïÖ¸Controller£©Ìṩһ¸öIBookRepository½Ó¿Ú£¬ÔÚÕâ¸ö½Ó¿ÚÖÐÉùÃ÷Ò»¸öIQueryable<Book>ÀàÐ͵ÄÊôÐÔBooks¡£ÕâÑù£¬Í¨¹ý¸Ã½Ó¿ÚʹÓÃÒÀÀµ×¢È룬ʹÓÃÕ߾ͿÉÒÔÄõ½BooksÊý¾Ý¼¯ºÏ£¬¶ø²»ÓùØÐÄÊý¾ÝÊÇÈçºÎµÃµ½µÄ¡£Îª´Ë£¬ÎÒÃÇÔÚBookShop.Domain¹¤³ÌÖÐÌí¼ÓÒ»¸öÃûΪ AbstractµÄÎļþ¼Ð£¬ÔÚ¸ÃÎļþ¼ÐÖÐÌí¼ÓÎÒÃǵÄIBookRepository½Ó¿ÚÎļþ£¬´úÂëÈçÏ£º
public interface IBookRepository { ???IQueryable<Book> Books { get; }}
ÔÚMVCÖÐÎÒÃÇÒ»°ã»áÓòִ¢Ä£Ê½£¨Repository Pattern£©°ÑÊý¾ÝÏà¹ØµÄÂß¼ºÍÁìÓòʵÌåÄ£ÐÍ·ÖÀ룬ÕâÑù¶ÔÓÚʹÓÃÕßÀ´Ëµ£¬Í¨¹ýµ÷Óòִ¢¶ÔÏó£¬Ê¹ÓÃÕß¿ÉÒÔÖ±½ÓÄõ½×Ô¼ºÏëÒªµÄÊý¾Ý£¬¶øÍêÈ«²»±Ø¹ØÐÄÊý¾Ý¾ßÌåÊÇÈçºÎÀ´µÄ¡£ÎÒÃÇ¿ÉÒ԰Ѳִ¢±ÈÓ÷³ÉÒ»¸ö³¬ÊУ¬³¬ÊÐÒѾΪÏû·ÑÕß¹©±¸ºÃÁËÉÌÆ·£¬Ïû·ÑÕßÖ»¹ÜÈ¥³¬ÊÐÑ¡¹º×Ô¼ºÐèÒªµÄÉÌÆ·£¬¶øÍêÈ«²»±Ø¹ØÐÄÕâЩÉÌÆ·ÊÇ´ÓÄÄЩ¹©Ó¦ÉÌÔõôÑùÔËÊäµ½³¬Êеġ£µ«¶ÔÓÚ²Ö´¢±¾Éí£¬±ØÐëҪʵÏÖ¶ÁÈ¡Êý¾ÝµÄ¡°ÇþµÀ¡±¡£
ÔÚBookShop.Domain¹¤³ÌÖÐÌí¼ÓÒ»¸öÃûΪConcreteÎļþ¼ÐÓÃÓÚ´æ·Å¾ßÌåµÄÀà¡£ÎÒÃÇÔÚConcreteÎļþ¼ÐÖÐÌí¼ÓÒ»¸öʵÏÖÁËIBookRepository½Ó¿ÚµÄBookRepositoryÀàÀ´×÷ΪÎÒÃǵÄBookÊý¾Ý²Ö´¢¡£BookRepositoryÀà´úÂëÈçÏ£º
public class BookRepository : IBookRepository { ???public IQueryable<Book> Books { ???????get { return GetBooks().AsQueryable(); } ???} ???private static List<Book> GetBooks() { ?????????//ΪÁËÑÝʾ£¬ÕâÀïÊÖ¹¤ÔìһЩÊý¾Ý£¬ºóÃæ»á½éÉÜʹÓÃEF´ÓÊý¾Ý¿âÖжÁÈ¡¡£ ???????List<Book> books = new List<Book>{ ???????????new Book { ID = 1, Title = "ASP.NET MVC 4 ±à³Ì", Price = 52}, ???????????new Book { ID = 2, Title = "CLR Via C#", Price = 46}, ???????????new Book { ID = 3, Title = "ƽ·²µÄÊÀ½ç", Price = 37} ???????}; ???????return books; ???}}
ΪÁËÑÝʾ£¬ÉÏÃæÊÇÊÖ¹¤ÔìµÄһЩÊý¾Ý£¬ºóÃæµÄÎÄÕÂÎÒ½«½éÉÜʹÓÃEntity Framwork´ÓÊý¾Ý¿âÖжÁÈ¡Êý¾Ý¡£¶ÔÓÚ¸Õ½Ó´¥ORM¿ò¼ÜµÄÅóÓÑ¿ÉÄܶÔÕâÀïIQueryable¸Ðµ½Ææ¹Ö£¬ÎªÊ²Ã´ÓÃIQueryable×÷Ϊ·µ»ØÀàÐÍ£¬¶ø²»ÓÃIEnumerableÄØ£¿ºóÃæÓлú»á½²Entity FramworkµÄʱºòÔÙ½²¡£
Ìí¼Ó°ó¶¨
´ò¿ªÖ®Ç°ÎÒÃÇÔÚBookShop.WebUI¹¤³Ì´´½¨µÄNinjectControllerFactoryÀ࣬ÔÚAddBindings·½·¨ÖÐÌí¼ÓÈçÏ´úÂ룺
private void AddBindings() { ???ninjectKernel.Bind<IBookRepository>().To<BookRepository>();}
Õâ¾ä´úÂ룬ͨ¹ýNinject°ÑIBookRepository½Ó¿Ú°ó¶¨µ½BookRepository£¬µ±IBookRepository½Ó¿ÚµÄʵÏÖ±»ÇëÇóʱ£¬Ninject½«×Ô¶¯´´½¨BookRepositoryÀàµÄʵÀý¡£
µ½ÕâÀNinjectµÄʹÓò½Öè¾Í½áÊøÁË£¬½ÓÏÂÀ´ÎÒÃǰѱ¾Ê¾ÀýÊ£ÓàµÄ²½ÖèÍê³É¡£
ÏÔʾÁбí
ÓÒ»÷BookShop.WebUI¹¤³ÌµÄControllersÎļþ¼Ð£¬Ìí¼ÓÒ»¸öÃûΪBookµÄController£¬°´ÏÂÃæ´úÂë¶ÔÆä½øÐб༣º
public class BookController : Controller { ???private IBookRepository repository; ???public BookController(IBookRepository bookRepository) { ???????repository = bookRepository; ???}}
ÔÚÕ⣬BookControllerµÄ¹¹Ô캯Êý½ÓÊÜÁËÒ»¸öIBookRepository²ÎÊý£¬µ±BookController±»ÊµÀý»¯µÄʱºò£¬Ninject¾ÍΪÆä×¢ÈëÁËBookRepositoryµÄÒÀÀµ¡£½ÓÏÂÀ´ÎÒÃÇΪÕâ¸öControllerÌí¼ÓÒ»¸öÃûΪListµÄAction£¬ÓÃÀ´³ÊÏÖBookÁÐ±í¡£´úÂëÈçÏ£º
public class BookController : Controller { ???... ???public ViewResult List() { ???????return View(repository.Books); ???}}
µ±È»ÎÒÃÇÐèÒªÌí¼ÓÒ»¸öView¡£ÓÒ»÷ÉÏÃæµÄList·½·¨£¬Ñ¡ÔñÌí¼ÓÊÓͼ£¬ÔÚµ¯³öµÄ´°¿Ú½øÐÐÈçÏÂÅäÖãº
È»ºóÎÒÃÇÔÚList.cshtmlÖÐÓÃforeachÑ»·À´ÁоÙÊé±¾ÐÅÏ¢£¬´úÂëÈçÏ£º
@model IEnumerable<BookShop.Domain.Entities.Book>@{ ???ViewBag.Title = "Books";}@foreach (var p in Model) { ?????<div class="item" style="border-bottom:1px dashed silver;"> ????????<h3>@p.Title</h3> ????????<p>¼Û¸ñ£º@p.Price.ToString("c") </p> ??????</div> ????}
×îºóÎÒÃÇ»¹ÐèÒªÐÞ¸ÄÒ»ÏÂĬÈÏ·ÓÉ£¬ÈÃϵͳÔËÐкóÖ±½Óµ¼Ïòµ½ÎÒÃǵÄ{controller = "Book", action = "List"}£¬´ò¿ªGlobal.asaxÎļþ£¬ÕÒµ½RegisterRoutes·½·¨£¬½øÐÐÈçÏÂÐ޸ģº
public static void RegisterRoutes(RouteCollection routes) { ???routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); ???routes.MapRoute( ???????"Default", // Route name ????????"{controller}/{action}/{id}", // URL with parameters ????????new { controller = "Book", action = "List", id = UrlParameter.Optional } ???);}
µ½Õ⣬ÎÒÃǵijÌÐò¿ÉÒÔÔËÐÐÁË£¬Ð§¹ûÈçÏ£º
½áÊøÓ
±¾ÎÄÊÇNinjectÔÚASP.NET MVCÖÐʹÓõÄÒ»¸ö¼òµ¥Ê¾Àý£¬Ä¿µÄÊÇÈôó¼ÒÁ˽âNinjectÔÚMVCÖеÄʹÓ÷½·¨¡£µ±È»£¬NinjectµÄÇ¿´óÖ®´¦²»½öÏÞÓÚ±¾ÎÄËùÑÝʾµÄ£¬ÏàÐŵ±ÄãÊìϤÁËNijectÖ®ºó£¬ÔڴMVCÓ¦ÓóÌÐòʱ£¬ÄãÒ»¶¨»áϲ»¶ÉÏËüµÄ¡£
ÆÀÂÛ¾«Ñ¡
#8Â¥[Â¥Ö÷] 2013-11-02 08:23 | Liam Wang#19Â¥ 2013-11-28 09:57 | ±ËÄê¶¹Þ¢@Liam Wang
²»ÐèÒª°¡£¬Ö»ÐèÒªÔÚApplication_Start()º¯ÊýÖÐ×¢²áһϣº
DependencyResolver.SetResolver(new Code.NinjectDependencyResolver());//×¢²áIocÈÝÆ÷
È»ºóÔÚ¾ßÌåʹÓÃÖУ¬Controller¹¹Ôì×¢Èë»òÕßʹÓÃÊôÐÔ×¢Èë¼´¿É
Ïà¹Ø´úÂ룺namespace LvJl.WebMvc.Code{ ???public class NinjectDependencyResolver:System.Web.Mvc.IDependencyResolver ???{ ???????private readonly IKernel _kernel; ???????public NinjectDependencyResolver() ???????{ ???????????_kernel=new StandardKernel(); ???????????AddBindings(); ???????} ???????private void AddBindings() ???????{ ???????????_kernel.Bind<IUserService>().To<UserService>(); ???????????_kernel.Bind<IRoleService>().To<RoleService>(); ???????} ???????public object GetService(Type serviceType) ???????{ ???????????return _kernel.TryGet(serviceType); ???????} ???????public IEnumerable<object> GetServices(Type serviceType) ???????{ ???????????return _kernel.GetAll(serviceType); ???????} ???}}protected void Application_Start(){ ???DependencyResolver.SetResolver(new Code.NinjectDependencyResolver());//×¢²áIocÈÝÆ÷ ???AreaRegistration.RegisterAllAreas(); ???WebApiConfig.Register(GlobalConfiguration.Configuration); ???FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); ???RouteConfig.RegisterRoutes(RouteTable.Routes); ???BundleConfig.RegisterBundles(BundleTable.Bundles);}public class UserController : Controller{ ???private readonly IUserService _user; ???public UserController(IUserService userService) ???{ ???????_user = userService; ???} ???public ActionResult Index() ???{ ???????return View(); ???} ???public ActionResult GetAllUsers() ???{ ???????var pageIndex = Request["page"] == null ? 1 : int.Parse(Request["page"]); ???????var pageSize = Request["rows"] == null ? 1 : int.Parse(Request["rows"]); ???????int total; ???????var data = _user.Query(pageIndex, pageSize, out total, u => true, true, u => u.Id); ???????var result = new {total, rows = data}; ???????return Json(result, JsonRequestBehavior.AllowGet); ???}}
[ASP.NET MVC Сţ֮·]05 - ʹÓà NinjectʵÏÖÒÀÀµ×¢Èë
ÔÎĵØÖ·£ºhttp://www.cnblogs.com/sjqq/p/7581509.html
BookControllerÀàµÄ´´½¨£¨º¬³õʼ»¯£©Ö÷Òª¾¹ýÏÂÃæÕâÈý¸ö¹ý³Ì£º
1.ÔÚApplication_StartÖУ¬ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());Õâ¶Î×¢²á´úÂë¸æËßMVCÓÃNinjectControllerFactory¹¤³§ÀàÀ´´´½¨ËùÓÐController¶ÔÏó¡£
ÔÚNinjectControllerFactoryÀàÖаüº¬ÁËÏÂÃæÁ½¸ö¹ý³Ì£º°ó¶¨½Ó¿Úµ½½Ó¿ÚµÄʵÏֺʹ´½¨ControllerÀà¶ÔÏó¡£
2.ninjectKernel.Bind<IBookRepository>().To<BookRepository>();Õâ¶Î°ó¶¨´úÂë¸æËßninjectKernelµ±±»ÇëÇóÒ»¸öIBookRepository½Ó¿ÚµÄʵÏÖʱÔò·µ»ØÒ»¸öBookRepository¶ÔÏó¡£
3.ÇëÄãÔĶÁNinjectControllerFactoryÀàÖеÄGetControllerInstance·½·¨£¬Í¨¹ýninjectKernel.Get(controllerType)Õâ¾ä´úÂ룬ninject»ñÈ¡controller£¨ÈçBookController£©¶ÔÏóµÄÐÅÏ¢²¢´´½¨¸ÃcontrollerµÄʵÀý£¬Õâ¸ö¹ý³Ì»áµ÷ÓÃcontrollerµÄ¹¹Ô캯Êý£¬Ëü»á×Ô¶¯ÅжϹ¹Ô캯ÊýËùÐèÒªµÄ²ÎÊý£¬ÈçBookControllerÀàµÄ¹¹Ô캯ÊýÐèÒªÒ»¸öIBookRepository½Ó¿Ú²ÎÊý£¬¸ù¾ÝµÚ2¸ö¹ý³Ìninject×¢²áµÄ°ó¶¨£¬ninject»á¸ø¸Ã¹¹Ô캯Êý´«µÝBookRepository¶ÔÏó(IBookRepository½Ó¿ÚµÄʵÏÖÕß)µÄÒýÓá£