我有一个简单的问题。我试图在我的asp.net MVC项目中使用Unity。我在EF上下文中使用工作单元模式时遇到问题。

说我在构造函数中注入了uow,但是在控制器中有4或5个需要在using语句中使用UnitOfWork的动作。这是行不通的!因为我必须做一个
每个动作方法中的new UnitOfWork()

我应该在每个操作方法中注入UnitOfWork吗?或只是构造函数?还是我应该全部注入!我面临的问题是我希望能够使用Mock数据对控制器进行单元测试,并且只有在注入UnitOfWorkDBContext时才能执行此操作。

最佳答案

注入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将在整个生命周期内重用同一会话


值得注意的是,从控制器的角度来看,哪个工厂为会话提供服务无关紧要,因为这仅仅是实现细节。这就是为什么我们将会话工厂依赖项隐藏在抽象之后(在此示例中为接口),并在应用程序的根目录执行所有对象到依赖项绑定。

10-06 05:30
查看更多