우리는 ASP.Net MVC + Autofac + EF6을 사용합니다. DbContext는 UnitOfWork에 의해 랩핑됩니다. 우리는 Autofac을 통해 각 http 요청에 대해 생성합니다. 또한 UnitOfWork 생성자에서 전체 http 요청에 대한 트랜잭션을 엽니 다.
문제는 모든 http 요청을 트랜잭션에 래핑해야하는 것은 아닙니다. 그들 중 일부는 심지어 DB에 대한 요청이 없습니다.
DB에 대한 첫 번째 실제 요청까지 트랜잭션 열기를 지연하고 싶습니다. 어떻게 할 수 있습니까?
SaveChages를 재정의하고 저장하기 전에 트랜잭션을 열 수 있지만, 선택 쿼리는이 방식으로 트랜잭션에서 실행되지 않습니다.
여기서 또 하나의 문제가 있습니다 : 소프트 탈착식 엔터티에 EF Plus의 글로벌 필터를 사용합니다. 잘 작동하지만 컨텍스트에 대한 필터 초기화는 다소 느립니다. DB에 대한 첫 번째 실제 요청까지 지연시키고 싶습니다.
문제는 액션이 호출 되더라도 UnitOfWork
가 컨트롤러에 주입되므로 사용하지 않아도 생성자가 항상 호출된다는 것입니다. 한 가지 해결책은 Autofac lazy injection을 사용하는 것일 수 있습니다. 이 경우 UnitOfWork
의 구성자는 인스턴스가 필요할 때만 호출됩니다.
public class SomeController : Controller {
//..
private readonly Lazy<IUnitOfWork> _unitOfWork;
private IAnotherService UnitOfWork => _unitOfWork.Value;
public SomeController(
//..
Lazy<IUnitOfWork> unitOfWork
)
{
//..
_unitOfWork = unitOfWork;
}
//..
public ActionResult ActionNeedsTransaction()
{
//use UnitOfWork
UnitOfWork.SaveChanges();
return Json(value);
}
}