ASP.NET MVC使用Ninject

原创 Laughing  2017-12-06 10:06  阅读 102 次 评论 0 条

本文主要介绍的是通过构造函数加上配置文件的形式,完成注入工作。当然网上很多人也说不依赖XMLNinject的一大优点,这里我也仅仅是进行演示,大家可以通过bind-to的方式直接进行的。

安装Nuget

Nuget的安装这里就不多介绍了,本文使用的Nuget包如下

  • Ninject
  • Ninject.Extensions.Xml
温馨提示

如果使用XML加载的方式,必须添加Ninject.Extensions.Xml

Ninject注入

我们继承DefaultControllerFactory创建NinjectControllerFactory,代码如下

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Threading.Tasks;  
  6. using Ninject;  
  7. using System.Web.Mvc;  
  8. using me.lisen.Db.CustomerDb;  
  9. using System.Web.Routing;  
  10. using System.Web;  
  11.   
  12. namespace me.lisen.Util.Loc  
  13. {  
  14.     public class NinjectControllerFactory : DefaultControllerFactory  
  15.     {  
  16.         IKernel kernel;  
  17.         public NinjectControllerFactory()  
  18.         {  
  19.             kernel = new StandardKernel();  
  20.             AddBinding();  
  21.         }  
  22.   
  23.         protected override IController GetControllerInstance(RequestContext context,Type controllerType)  
  24.         {  
  25.             return controllerType == null ? null : (IController)kernel.Get(controllerType);  
  26.         }  
  27.   
  28.         public void AddBinding()  
  29.         {  
  30.             kernel.Load(HttpContext.Current.Server.MapPath(".")+"\\XmlConfig\\Ninject.xml");  
  31.             //kernel.Bind<ICustomerDb>().To<CustomerDb>();  
  32.         }  
  33.     }  
  34. }  

创建接口和实现类,具体代码如下

  1. using me.lisen.Models;  
  2. using System;  
  3. using System.Collections.Generic;  
  4. using System.Linq;  
  5. using System.Text;  
  6. using System.Threading.Tasks;  
  7.   
  8. namespace me.lisen.Db.CustomerDb  
  9. {  
  10.     public interface ICustomerDb  
  11.     {  
  12.         List<Customer> GetCustomers();  
  13.         List<Customer> GetCustomers(string whereKey, string whereValue);  
  14.     }  
  15. }  
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Threading.Tasks;  
  6. using me.lisen.Models;  
  7. using Ninject;  
  8. using System.Data.Entity;  
  9.   
  10. namespace me.lisen.Db.CustomerDb  
  11. {  
  12.     public class CustomerDb : ICustomerDb  
  13.     {  
  14.         private readonly NorthwindContext context;  
  15.   
  16.         [Inject]  
  17.         public CustomerDb()  
  18.         {  
  19.             context = new NorthwindContext();  
  20.         }  
  21.           
  22.         public List<Customer> GetCustomers()  
  23.         {  
  24.             return context.Customers.ToList<Customer>();  
  25.         }  
  26.   
  27.         public List<Customer> GetCustomers(string whereKey, string whereValue)  
  28.         {  
  29.             return context.Customers.Where(e => e.ContactName == whereValue).ToList<Customer>();  
  30.         }  
  31.     }  
  32. }  

修改Global.asaxApplication_Start方法,添加以下代码

  1. ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());  

使用

我们通过构造函数调用,修改控制器构造函数

  1. private readonly ICustomerDb customerDb;  
  2.          
  3.        public CustomerController(ICustomerDb customerDb) {  
  4.            this.customerDb = customerDb;            
  5.        }  

xml文件配置

  1. <module name="Db">  
  2.   <bind service="me.lisen.Db.CustomerDb.ICustomerDb,me.lisen.Db" to="me.lisen.Db.CustomerDb.CustomerDb,me.lisen.Db"></bind>  
  3. </module>  

本文地址:https://www.lisen.me/asp-net-mvc-uses-ninject.html
版权声明:本文为原创文章,版权归 木子网 所有,欢迎分享本文,转载请保留出处!

发表评论


表情