当前位置: 首页 > 工具软件 > Ninject > 使用案例 >

ASP.NET MVC中使用Ninject总结

柯阳曦
2023-12-01
     要使用Ninject者,想必对依赖注入都比较了解,作为众多依赖注入容器之一的Ninject,和.net结合的很紧密,在开发ASP.NET MVC网站时,使用Ninject作为默认的实例构造容器很方便。当然,除了依赖注入以外,Ninject还提供有许多其他用处,也可用于其他架构的项目中,此处仅介绍在ASP.NET MVC中使用Ninject提供依赖注入管理。
     在一个系统中,我们需要建立一个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,为抽象类绑定子类同样适用以上方法
     




 类似资料: