我有一个简单的问题。我试图在我的asp.net MVC项目中使用Unity。我在EF上下文中使用工作单元模式时遇到问题。
说我在构造函数中注入了uow,但是在控制器中有4或5个需要在using语句中使用UnitOfWork
的动作。这是行不通的!因为我必须做一个
每个动作方法中的new UnitOfWork()
。
我应该在每个操作方法中注入UnitOfWork
吗?或只是构造函数?还是我应该全部注入!我面临的问题是我希望能够使用Mock数据对控制器进行单元测试,并且只有在注入UnitOfWork
或DBContext
时才能执行此操作。
最佳答案
注入factory代替。这样,您仍然可以实现关注点分离和松散耦合,但是使用using语句不会遇到任何问题:
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
将在整个生命周期内重用同一会话值得注意的是,从控制器的角度来看,哪个工厂为会话提供服务无关紧要,因为这仅仅是实现细节。这就是为什么我们将会话工厂依赖项隐藏在抽象之后(在此示例中为接口),并在应用程序的根目录执行所有对象到依赖项绑定。