2

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

在核心中,如果我执行调用 base.dispose() 的简单方法覆盖,我可以看到从控制器调用 dispose 的位置。但是,我的服务似乎开始了它的处置过程,我被困在使用 LightInject 的 PerRequestLifetime 范围来摆脱可处置的资源。这只是与核心不同吗?通常瞬变给了我我所期望的行为(在调用 controller.dispose() 时对依赖项进行 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);
        }
}
4

0 回答 0