gpt4 book ai didi

c# - 使用 Unity 容器进行 MVC 单元测试

转载 作者:行者123 更新时间:2023-11-30 15:35:57 27 4
gpt4 key购买 nike

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

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

我应该在每个操作方法中注入(inject)一个 UnitOfWork 吗?还是只进入构造函数?或者我什至应该注入(inject)这个!!我面临的问题是我希望能够使用 Mock 数据对我的 Controller 进行单元测试,并且我只能在注入(inject) UnitOfWorkDBContext 时执行此操作。

最佳答案

注入(inject) factory反而。通过这种方式,您仍然可以实现关注点分离和松散耦合,但您不会遇到 using 语句的任何问题:

private IUnitOfWorkFactory factory;

public MyController(IUnitOfWorkFactory factory)
{
this.factory = factory;
}

public ActionResult MyAction()
{
using (var uow = factory.CreateUnitOfWork())
{
// ...
}
}

编辑:

这种方法的天然优势在于它的可配置性——您可以注册任何您喜欢的工厂来为不同的 Controller 提供服务,并将其连接到组合根:

// 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 将使用在引擎盖下根据每个请求提供新 session 的工厂
  • HomeController 另一方面,将在其整个生命周期内重用同一个 session

值得注意的是,从 Controller 的角度来看,哪个工厂为 session 提供服务是无关紧要的,因为它只是一个实现细节。这就是为什么我们将 session 工厂依赖项隐藏在抽象背后(本例中的接口(interface))并在应用程序的根目录执行所有对象到依赖项的绑定(bind)。

关于c# - 使用 Unity 容器进行 MVC 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14317984/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com