如何将值传递给控制器的构造函数

本文关键字:控制器 构造函数 值传 | 更新日期: 2023-09-27 18:32:38

因此,为了对控制器进行单元测试,我正在尝试精简控制器并使它们更易于测试。我们使用服务/存储库模式,我们遇到的一个问题是服务层的多个实例化。控制器中的每个方法都实例化服务层的新实例。为了纠正这一点,我想在控制器的构造函数中实例化一次。

下面是我们典型的控制器方法的示例:

public class GroupController : ControllerBase // ControllerBase is derived from System.Web.Mvc.Controller
{
    public ActionResult EditGroup(int groupId)
    {
        EditGroupViewModel model = new EditGroupViewModel();
        using (var service = new AccountServices(this.User)) // this.User is an instance of IPrincipal Controller.User            {
            Group group = service.GetGroupWithRoles(groupId);
            // some code to map Group to EditGroupViewModel
        }
        return View(model);
    }
}

任何使用帐户服务的方法都必须实例化类的新实例,如上所示。理想情况下,AccountServices 将在控制器的构造函数中实例化一次。但是,我不确定该怎么做。

这是我尝试过的:

    private readonly AccountServices _service;
    public GroupController(IPrincipal user)
    {
        _service = new AccountServices(user);
    }

但是,在构造函数上放置断点时,我看到 IPrinicipal 用户仍然为空。我认为我最大的障碍是AccountServices需要一个IPrincipal Controller.User来实例化。 如何在构造函数中实例化一次 AccounServices,以便控制器的所有方法都可以使用该实例?

如何将值传递给控制器的构造函数

您可以使用依赖注入和自定义工厂。这是一个帮助您入门的网站。