因此,我正在开发一个简单的项目,该项目利用了 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);
}
}