我无法理解如何设置我的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。
答案 0 :(得分:1)
这个将所有东西连接在一起的地方叫做 DI术语中的组成根
其中一个建议是为所有图层创建一个引导程序。检查这个SO:
答案 1 :(得分:0)
这不是最好的答案,但我遇到了同样的问题。首先,确保在服务层中引用了Ninject和Ninject.Web.Common,并且在模块类中有Ninject.Web.Common的using语句。
我无法在Intellisense中找到InRequestScope。我尝试了几次打开和关闭项目,最终出现了。除了关闭并重新打开Visual Studio之外,它没有做任何事情,它开始工作了。