使用Ninject和HierarchicalLifetimeManager的ASP.Net MVC 3项目?

时间:2012-01-13 18:16:46

标签: asp.net-mvc-3 unity-container ninject-2

首先,依赖注入对我来说相对较新。我使用Unity.MVC3做了第一个项目,现在我想在一个新项目上切换到Ninject,因为它似乎是.Net项目最受欢迎的依赖注入器。所以现在,我正在尝试在我的项目中使用Ninject v2.2.1.4和Ninject.MVC3 v2.2.2.0。

在我之前使用Unity的项目中,我在Bootstrapper类中有类似下面的代码:

private static IUnityContainer BuildUnityContainer()
{
    var container = new UnityContainer();

    container.RegisterType<ITestService, TestService>();            
    container.RegisterType<IDatabaseFactory, DatabaseFactory>(new HierarchicalLifetimeManager());
    container.RegisterType<IUnitOfWork, UnitOfWork>();
    container.RegisterType<ILoggingService, LoggingService>();

    container.RegisterControllers();

    return container;
}

现在,我的新项目,我用NinjectMVC3类(App_Start)中的以下代码替换了它:

private static void RegisterServices(IKernel kernel)
{
    kernel.Bind<ITestService>().To<TestService>();
    //This does not compile:
    //kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>(new HierarchicalLifetimeManager());
    kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>();
    kernel.Bind<IUnitOfWork>().To<UnitOfWork>();
    kernel.Bind<ILoggingService>().To<LoggingService>();
} 

但是,我不知道我应该如何处理DatabaseFactory绑定,因为它通常需要使用HierarchicalLifetimeManager。谁能告诉我如何正确创建DatabaseFactory的绑定?

1 个答案:

答案 0 :(得分:0)

首先,在NuGet中添加这些引用,以确保您拥有一组兼容的包。

然后,如果添加Ninject.Web.MVC,它将通过电源shell脚本为您设置项目初始化代码。

最后制作一个像这样的BindModule类,并将它添加到CreateKernel方法中的模块中,该方法已在第二步中创建。

public class BindModule : NinjectModule
{
    public override void Load()
    {
        this.Bind<IControllerActivator>().To<CustomControllerActivator>().InRequestScope();
        this.Bind<MembaseClient>().ToMethod(context => new MembaseClient()).InSingletonScope();
        this.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope();
        this.Bind<ISessionFactory>().ToMethod(o => MyAutoMapper.sessionFactory).InSingletonScope();
        this.Bind<ISession>().ToMethod(o => MyAutoMapper.sessionFactory.OpenSession()).InRequestScope();
        }
  }

NinjectMVC3类的一部分

public static class NinjectMVC3
{
    /// <summary>
    /// Creates the kernel that will manage your application.
    /// </summary>
    /// <returns>The created kernel.</returns>
    private static IKernel CreateKernel()
    {
        var modules = new NinjectModule[] { new BindModule() };
        var kernel = new StandardKernel(modules);

        RegisterServices(kernel);

        return kernel;
    }
}

正如您在上面所看到的,Ninjet内置了一些功能来处理每个对象的不同生命周期。