如何将值传递给Controller的构造函数?

时间:2016-01-30 19:39:53

标签: c# model-view-controller repository-pattern

因此,为了对我们的控制器进行单元测试,我试图减少控制器的尺寸并使其更易于测试。我们使用Service / Reposistory模式,我们遇到的一个问题是我们服务层的多个实例。控制器中的每个方法都实例化服务层的新实例。为了纠正这个问题,我想在Controller的构造函数中实例化一次。

以下是我们典型的Controller方法的示例:

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的方法都必须实例化该类的新实例,如上所示。理想情况下,AccountServices将在Controller的构造函数中一次实例化。但是,我不确定如何做到这一点。

以下是我的尝试:

    private readonly AccountServices _service;

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

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

1 个答案:

答案 0 :(得分:4)

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