使用服务层的NinjectModules

时间:2014-07-01 18:19:15

标签: c# asp.net-mvc entity-framework dependency-injection ninject

我无法理解如何设置我的Ninject IoC容器。 我有一个服务层,其中包含几个服务的实现以及我的DbContext和ASP.NET标识的实现,如下所示:

public class IdentityModule : NinjectModule
{
        public override void Load()
        {
            Bind<IUserStore<User, int>>().To<UserService>().InSingletonScope();
            Bind<UserManager<User, int>>().ToSelf().InSingletonScope();

            Bind<IRoleStore<UserRole, int>>().To<UserRoleService>().InSingletonScope();
            Bind<RoleManager<UserRole, int>>().ToSelf().InSingletonScope();
        }
}

public class EntityFrameworkModule : NinjectModule
{
       public override void Load()
       {
           Bind<EntityDbContext>().ToSelf();
           Bind<ICreateDbModel>().To<DefaultDbModelCreator>();
           Bind<IUnitOfWork>().To<EntityDbContext>();
           Bind<IWriteEntities>().To<EntityDbContext>();
           Bind<IReadEntities>().To<EntityDbContext>();
       }
}

这些已加载到我的NinjectWebCommen(MVC图层)中:

private static void RegisterServices(IKernel kernel)
{
    var modules = new INinjectModule[]
                      {
                         new EntityFrameworkModule(),
                         new IdentityModule()
                      };

    kernel.Load(modules);
}

现在我的问题是:

我的EntityDbContext应该是请求作用域,但我无法从服务层设置.InRequestScope()。那么INinjectModule是否应该移动到MVC层而不是位于服务层中,还是应该在我的服务层中引用Ninject.Web.Common?这似乎是一种错误的方式,因为服务层不是web-app。

2 个答案:

答案 0 :(得分:1)

  

这个将所有东西连接在一起的地方叫做   DI术语中的组成根

其中一个建议是为所有图层创建一个引导程序。检查这个SO:

Where to locate Ninject modules in a multi-tier application

答案 1 :(得分:0)

这不是最好的答案,但我遇到了同样的问题。首先,确保在服务层中引用了Ninject和Ninject.Web.Common,并且在模块类中有Ninject.Web.Common的using语句。

我无法在Intellisense中找到InRequestScope。我尝试了几次打开和关闭项目,最终出现了。除了关闭并重新打开Visual Studio之外,它没有做任何事情,它开始工作了。