要使用Ninject者,想必对依赖注入都比较了解,作为众多依赖注入容器之一的Ninject,和.net结合的很紧密,在开发ASP.NET MVC网站时,使用Ninject作为默认的实例构造容器很方便。当然,除了依赖注入以外,Ninject还提供有许多其他用处,也可用于其他架构的项目中,此处仅介绍在ASP.NET MVC中使用Ninject提供依赖注入管理。
在一个系统中,我们需要建立一个Email系统,实现Email的发送;
如此,当MVC调用PasswordResetHelperController时,会自动通过Ninject来用MyEmailSender生成IEmailSender的实例传入PasswordResetHelperController的构造方法中。
分别创建了IEmailSender接口,MyEmailSender实现该接口。PasswordReset调用该接口。
代码实现如下:
public interface IEmailSender{public void SendEmial;}
public class MyEmailSender:IEmailSender{public void SendEmail(){// 实现邮件发送}}
public class PasswordResetHelperController{private IEmailSender mySender;public PasswordRestHelpController(IEmailSender sender){mySender=sender;}public void ResetPassword(){// 调用EmailSender 里的方法来实现邮件发送mySender.SendEmail();}}
要在项目中使用Ninject,首先添加Ninject引用包;之后,使用Ninject步骤如下:
1,新建类DIContainer作为DI容器,如果需要用Ninject来帮助Controller实例接口,则该容器需继承自DefaultControllerFactory
2,在DI容器中实例Ninject的核心管理引用 ;
3,通过Ninject把接口和实现该接口的类绑定起来;
4,配置MVC的启动信息,实现当需要某个接口类型的实例时,会自动调用Ninject来生成并传递此实例;
示例代码如下
using System;
using System.Web.Mvc;
using System.Web.Routing;
using Ninject;
using SportsStore.Domain.Abstract;
using SportsStore.Domain.Concrete;
namespace SportsStore.WebUI.Infrastructure
{
// NinjectControllerFactory用来管理DI
public class NinjectControllerFactory : DefaultControllerFactory
{
// Ninject中用来管理接口和实例的核心Ninject接口
private IKernel ninjectKernel;
public NinjectControllerFactory()
{
// 通过new StandardKernel得到
ninjectKernel = new StandardKernel ();
AddBindings();
}
// 通过重写此方法实现用Ninject提供接口的实例
protected override IController GetControllerInstance( RequestContext requestContext,
Type controllerType)
{
return controllerType == null
? null
: ( IController )ninjectKernel.Get(controllerType);
}
// 实现接口和实例类绑定的代码均在此方法中
private void AddBindings()
{
ninjectKernel.Bind< IEmailSender>().To<MyEmailSender>();
}
}
}
在MVC项目的Global.aspx中的Application_Start()方法中添加如下代码注册自定义的Controller构造类:
ControllerBuilder .Current.SetControllerFactory( new NinjectControllerFactory ());
下面介绍Ninject中常用的一些方法:
1,把某个类绑定到某个接口:
ninjectKernel.Bind< ISomeInterface>().To<SomeImpMethod>();
2,得到某个接口的实例:
ninjectKernel.Get<ISomeInterface>();
3,附带参数,实现为实例中的属性赋值的方式绑定:
ninjectKernel.Bind<ISomeInterface>() .To<SomeMethod>(). WithPropertyValue("SomeProprity", value);
4,附带参数,实现构造方法中传入参数
ninjectKernel.Bind<ISomeInterface>().To<SomeMethod>(). WithConstructorArgument("someParam", value);
5,为一个接口绑定多个实例,实现不同的类调用时,产生不同的实例:
ninjectKernel.Bind<ISomeInterface>() .To<SomeMethod>().WhenInjectedInto<SomeType>() 实现SomeType类里需要该接口实例时,会通过此处绑定的实例在生成
ninjectKernel.Bind<ISomeInterface>() .To<SomeMethod>().WhenClassHas<SomeProprity>()
实现当
用了
SomeProprity属性的类
需要该接口实例时,会通过此处绑定的实例在生成
6,为抽象类绑定子类同样适用以上方法