Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将值传递给控制器';谁的构造函数?_C#_Model View Controller_Repository Pattern - Fatal编程技术网

C# 如何将值传递给控制器';谁的构造函数?

C# 如何将值传递给控制器';谁的构造函数?,c#,model-view-controller,repository-pattern,C#,Model View Controller,Repository Pattern,所以,为了对我们的控制器进行单元测试,我试图缩小控制器的尺寸,使其更易于测试。我们使用服务/存储模式,其中一个问题是服务层的多个实例化。控制器中的每个方法都实例化服务层的一个新实例。为了纠正这个问题,我想在控制器的构造函数中实例化一次 以下是我们典型控制器方法的示例: public class GroupController : ControllerBase // ControllerBase is derived from System.Web.Mvc.Controller { pub

所以,为了对我们的控制器进行单元测试,我试图缩小控制器的尺寸,使其更易于测试。我们使用服务/存储模式,其中一个问题是服务层的多个实例化。控制器中的每个方法都实例化服务层的一个新实例。为了纠正这个问题,我想在控制器的构造函数中实例化一次

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

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将在控制器的构造函数中实例化一次。然而,我不确定如何做到这一点

以下是我尝试过的:

    private readonly AccountServices _service;

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

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

您可以使用依赖项注入和自定义工厂。以下是一个开始。

可能的解决方案是使用依赖项注入容器,行
AutoFac
,并将依赖项声明为接口,如
IAccountServices
。之后,您可以将其注册为单个实例<代码>生成器.Register().As().SingleInstance()使用支持每个请求实例化的DI容器(可能所有广泛使用的容器都有这种支持)可能是更好的解决方案。。。(并没有真正回答你们的问题)。MVC不知道它应该用IPrincipal给你们的控制器打电话。您应该从构造函数中的控制器上下文中获取主体。但是考虑一下使用DI容器,它会使您的生活更轻松。我建议使用Unity而不是AutoFac,因为ASP.NET Core 1内置了Unity。对于模拟,您有什么建议?Moq?谢谢你的链接。我认为我最大的障碍是AccountServices需要一个IPrincipal Controller.users不确定您的具体情况,但如果您使用的是集成windows安全性,则可以从HttpContext.Current.Request.LogonUserIdentity获取用户标识;如果使用表单身份验证,则可以从HttpContext.Current.user.identity获取用户标识我的无知,但我相信我们正在使用表单身份验证。调用构造函数时,我可以获取用户标识吗?