而是注入工厂。这样您仍然可以实现关注点分离和松耦合,但您不会遇到使用语句的任何问题:
private IUnitOfWorkFactory factory;
public MyController(IUnitOfWorkFactory factory)
{
this.factory = factory;
}
public ActionResult MyAction()
{
using (var uow = factory.CreateUnitOfWork())
{
// ...
}
}
编辑:
这种方法的自然优势在于它的可配置性——你可以注册你喜欢的任何工厂来服务不同的控制器,并将其连接到组合根:
// Note: this isn't unity syntax, but I hope my point is clear
container.Register<ISessionFactory, ReusableSessionFactory>("Reusable");
container.Register<ISessionFactory, FreshSessionFactory>("Fresh");
container.Register<IController, LoginController>().With("Fresh");
container.Register<IController, HomeController>().With("Reusable");
现在,
LoginController
将使用在每个请求下提供新会话的工厂
HomeController
另一方面,将在其整个生命周期内重用同一个会话
值得注意的是,从控制器的角度来看,哪个工厂为会话提供服务是无关紧要的,因为它只是一个实现细节。这就是为什么我们将会话工厂依赖隐藏在抽象之后(本例中的接口),并在应用程序的根目录执行所有对象到依赖的绑定。