[NServiceBus.Ninject在异步情况下绑定dbcontext

问题描述 投票:1回答:1

我试图弄清楚如何在异步方法中使用Ninject和dbcontext。让我向您展示一些代码示例:

IUs​​erService.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方法,但没有任何改变。

c# ninject nservicebus
1个回答
0
投票

据我所知,Ninject的文档和作用域处理可以尝试:

© www.soinside.com 2019 - 2024. All rights reserved.