首先,依赖注入对我来说相对较新。我使用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的绑定?
答案 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内置了一些功能来处理每个对象的不同生命周期。