在一个系统中,我们需要建立一个Email系统,实现Email的发送;
分别创建了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 ());
如此,当MVC调用PasswordResetHelperController时,会自动通过Ninject来用MyEmailSender生成IEmailSender的实例传入PasswordResetHelperController的构造方法中。
下面介绍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,为抽象类绑定子类同样适用以上方法