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