本文主要介绍的是通过构造函数加上配置文件的形式,完成注入工作。当然网上很多人也说不依赖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>
win10似乎不行啊……肿么办
谢谢