【问题标题】:Dependency Injected Repository Pattern object gets disposed after asyn call依赖注入存储库模式对象在异步调用后被释放
【发布时间】:2016-10-10 16:31:29
【问题描述】:

我正在我的 WebAPI 应用程序的业务层中进行 PostAsync 调用。

使用 AutoFac 我正在设置我的绑定,如下所示:

builder.RegisterGeneric(typeof(SqlServerRepository<>))
       .As(typeof(IRepository<>))
       .InstancePerLifetimeScope();
builder.RegisterType<WspSQLDbContext>()
       .As<DbContext>()
       .InstancePerLifetimeScope();

存储库被注入到控制器中:

public KenSciConnector(log4net.ILog logger, IRepository<KenSciBatch> kensciBatchRepository) {
    _logger = logger;
    _kensciBatchRepository = kensciBatchRepository;
}

调用异步函数的函数如下所示:

public Response SendToVendor(Observation observation) {
    Response batchingResponse;
    // some logic
    var sendResponse = SendToKensci(requestObject, batch);           
    return batchingResponse;
}

...实际上使异步调用的函数如下所示:

private async Task<Response> SendToKensci(KenSciRequest requestObject, KenSciBatch kenSciBatch) {
    var response = new Response();

    try {
        var httpClient = new HttpClient();

        await httpClient
            .PostAsync(httpClient.BaseAddress, new StringContent(seralizedObject, Encoding.UTF8, "application/json"))
            .ContinueWith((requestTask) => UpdateBatch(requestTask, kenSciBatch));
        } catch (Exception e) {
            // some logic
            return response;
        }

        // some logic
        return response;
    }

在我尝试更新的回调函数中,我得到一个异常,DbContext 已被释放。

private void UpdateBatch(Task<HttpResponseMessage> requestTask, KenSciBatch kenSciBatch) {
    try {
        if (requestTask.Result.StatusCode == HttpStatusCode.OK) {
            kenSciBatch.Status = BatchStatus.Sent;
            _kensciBatchRepository.Update(kenSciBatch);
        }
    } catch (Exception ex) {
        throw ex;
    }
}

【问题讨论】:

  • 是的,这就是问题所在。 put 是一个答案。

标签: c# dependency-injection async-await asp.net-web-api2 autofac


【解决方案1】:

这里:

var sendResponse = SendToKensci(requestObject, batch); 

你不等待SendToKensci(它返回Task),所以有时在它执行的中间 - 上下文被释放(因为你已经离开了SendToVendor函数)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多