【发布时间】:2015-12-05 04:39:49
【问题描述】:
我有一个现有的 Web 项目,我将其转换为使用 Ninject,并将绑定设置为 InRequestScope。
// binding in AppStart
kernel.Bind<IDbContext>().To<DbContext>().InRequestScope();
...
// business layer
public class BusinessService {
public BusinessService(IDbContext context) {
this.Context = context;
}
private IDbContext Context { get; set; }
public void UpdateUser(int userId) {
User user = this.Context.Users.Single(u => u.UserId == userId);
user.LastUpdated = DateTime.Now;
this.Context.SaveChanges();
}
}
现在,我正在尝试转换一些使用业务层代码的控制台应用程序。
// ... Console App ...
foreach(int userId in usersNeedingToBeUpdated) {
// do stuff to each user
BusinessService businessService = kernel.Get<BusinessService>();
businessLayer.UpdateUser(userId);
}
但是,我无法理解范围。我希望每次我为 Ninject 执行 kernel.Get() 时都给我一个新的 IDbContext 并处理旧的 IDbContext。我试过做
kernel.Bind<IDbContext>().To<DbContext>().InParentScope();
这一直有效,直到有人直接请求 IDbContext:
kernel.Get<IDbContext>();
然后我得到一个空指针异常,因为没有父作用域。如果我改用 TransientScope,则 Ninject 不会处理 IDbContext1。我怎样才能将它带到每个内核的位置。Get() 我得到一个新服务以及新的依赖项和旧的依赖项被释放?
我已阅读this post,但我仍然不确定该怎么做。
【问题讨论】:
-
请参阅 here 了解
InRequestScope的工作原理,并希望为您提供足够的详细信息,让您了解自己需要什么。
标签: c# dependency-injection scope ninject