ASP.Net Core Dispose vs Per Request Lifetime

时间:2016-11-01 01:14:47

标签: asp.net-core dispose light-inject

所以我正在开发一个简单的项目,该项目利用api层,服务层(思考业务逻辑)以及围绕它的所有适当的支持层。在过去,我相信当控制器超出范围时,Web Api 2请求将启动处置层次结构(因此,从api调用并且是类的数据成员的任何服务都与其后续存储库/依赖项一起处理) 。

在核心中,如果我执行一个调用base.dispose()的简单方法覆盖,我可以看到从控制器调用dispose的位置。然而,似乎我的服务开始其处理过程我被困在使用LightInject的PerRequestLifetime范围来摆脱一次性资源。这与核心有什么不同吗?通常瞬态给了我我期望的行为(当调用controller.dispose()时,会调用依赖关系)。完全披露我以前完成的工作使用的是Unity IoC容器。

我相信最终结果与覆盖控制器dispose方法调用service.dispose()相同,但我对核心上下文中LightInject瞬态的行为感到惊讶。

这是我的存储库,其中包含示例代码https://github.com/napalm684/ReciPiBookCore

当然主要关注的是UnitOfMeasureController和UnitOfMeasureService。 DI层(特别是https://github.com/napalm684/ReciPiBookCore/blob/master/src/ReciPiBook.Di/ServiceContainerExtensions.cs)是您可以找到服务的LightInject注册工作的地方。

注册

container.Register<IUnitOfMeasureService, UnitOfMeasureService>(new PerRequestLifeTime());

控制器

[Route("api/[controller]")]
public class UnitOfMeasureController : Controller
{
    private readonly IUnitOfMeasureService _unitOfMeasureService;

    public UnitOfMeasureController(IUnitOfMeasureService unitOfMeasureService)
    {
        _unitOfMeasureService = unitOfMeasureService;
    }

    [HttpGet]
    [Route("{id:int}")]
    public string Get(int id)
    {
        return _unitOfMeasureService.Get(id).Description;
    }
}

服务

public class UnitOfMeasureService : IUnitOfMeasureService
{
        private readonly IRepository<Entities.UnitOfMeasure> _repository;
        private bool _disposed = false;

        public UnitOfMeasureService(IRepository<Entities.UnitOfMeasure> repository)
        {
            _repository = repository;
        }

        public Dtos.UnitOfMeasure Get(int id)
        {
            return _repository.Get(id).AsUnitOfMeasure();
        }

        protected virtual void Dispose(bool disposing)
        {
            if (_disposed) return;

            if (disposing)
                _repository.Dispose();

            _disposed = true;
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
}

0 个答案:

没有答案