ASP.NET MVC使用Ninject

Laughing
2017-12-06 / 0 评论 / 1,331 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2021年04月27日,已超过1361天没有更新,若内容或图片失效,请留言反馈。

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

安装Nuget

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

Ninject
Ninject.Extensions.Xml

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

Ninject注入

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

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Threading.Tasks;  
using Ninject;  
using System.Web.Mvc;  
using me.lisen.Db.CustomerDb;  
using System.Web.Routing;  
using System.Web;  
  
namespace me.lisen.Util.Loc  
{  
    public class NinjectControllerFactory : DefaultControllerFactory  
    {  
        IKernel kernel;  
        public NinjectControllerFactory()  
        {  
            kernel = new StandardKernel();  
            AddBinding();  
        }  
  
        protected override IController GetControllerInstance(RequestContext context,Type controllerType)  
        {  
            return controllerType == null ? null : (IController)kernel.Get(controllerType);  
        }  
  
        public void AddBinding()  
        {  
            kernel.Load(HttpContext.Current.Server.MapPath(".")+"\\XmlConfig\\Ninject.xml");  
            //kernel.Bind<ICustomerDb>().To<CustomerDb>();  
        }  
    }  
}

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

using me.lisen.Models;  
using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Threading.Tasks;  
  
namespace me.lisen.Db.CustomerDb  
{  
    public interface ICustomerDb  
    {  
        List<Customer> GetCustomers();  
        List<Customer> GetCustomers(string whereKey, string whereValue);  
    }  
}  
using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Threading.Tasks;  
using me.lisen.Models;  
using Ninject;  
using System.Data.Entity;  
  
namespace me.lisen.Db.CustomerDb  
{  
    public class CustomerDb : ICustomerDb  
    {  
        private readonly NorthwindContext context;  
  
        [Inject]  
        public CustomerDb()  
        {  
            context = new NorthwindContext();  
        }  
          
        public List<Customer> GetCustomers()  
        {  
            return context.Customers.ToList<Customer>();  
        }  
  
        public List<Customer> GetCustomers(string whereKey, string whereValue)  
        {  
            return context.Customers.Where(e => e.ContactName == whereValue).ToList<Customer>();  
        }  
    }  
}

修改Global.asax中Application_Start方法,添加以下代码

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

使用

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

private readonly ICustomerDb customerDb;  
         
       public CustomerController(ICustomerDb customerDb) {  
           this.customerDb = customerDb;            
       }

xml文件配置

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

评论 (0)

取消
  1. 头像
    vivi
    Windows 10 · MicroSoft Edge

    win10似乎不行啊……肿么办

    回复
  2. 头像
    leon
    MacOS · Safari

    谢谢

    回复