我试图弄清楚如何在异步方法中使用Ninject
和dbcontext。让我向您展示一些代码示例:
IUserService.cs
public interface IUserService
{
Task<bool> HasAccessToX(string username);
Task<bool> HasAccessToY(string username);
}
UserService.cs
public class UserService : IUserService
{
private static ApplicationDbContext _db;
public UserService(ApplicationDbContext database)
{
_db = database;
}
public Task<bool> HasAccessToX(string username)
{
try
{
var result = await _db.Users.Where(...).FirstAsync();
return result != null;
}
catch (Exception ex)
{
log.Error(ex);
return false;
}
}
public async Task<bool> HasAccessToY(string username)
{
try
{
var result = await _db.Modules.FirstAsync(...);
return result;
}
catch (Exception ex)
{
log.Error(ex);
return false;
}
}
}
AccessController.cs
public class AccessController : ApiController
{
private readonly IUserService UserService;
public AccessController(IUserService userService)
{
UserService = userService;
}
[HttpGet]
[Route("api/Access/Permissions")]
public async Task<HttpResponseMessage> Permissions()
{
try
{
string username = User.Identity.Name;
var model = new PermissionsPackViewModel()
{
//...
ModuleX = await UserService.HasAccessToX(username),
ModuleY = await UserService.HasAccessToY(username)
};
return Request.CreateResponse(HttpStatusCode.OK, model);
}
catch (Exception ex)
{
return Request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message);
}
}
}
NinjectWebCommon.cs
var endpointConfiguration = new EndpointConfiguration("Samples.Ninject");
endpointConfiguration.UseContainer<NinjectBuilder>(
customizations: customizations =>
{
customizations.ExistingKernel(kernel);
});
kernel.Bind<ApplicationDbContext>().ToSelf()
.WhenNotInUnitOfWork()
.InRequestScope();
kernel.Bind<ApplicationDbContext>().ToSelf()
.WhenInUnitOfWork()
.InUnitOfWorkScope();
kernel.Bind<IUserService>().To<UserService>();
kernel.Bind<IAnotherService>().To<AnotherService>();
// rest of my services bindings
我是基于NServiceBus.Ninject文档制作的,但由于它没有任何作用,我仍然会误解一些内容,但仍然会出现错误:
由于已处置DbContext,因此无法完成操作。
所以,我的问题是:我做错了什么?
编辑我已经根据@jbl答案更改了WhenInUnitOfWork
的NServiceBus.Ninject方法,但没有任何改变。
据我所知,Ninject的文档和作用域处理可以尝试: