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获取用户标识我的无知,但我相信我们正在使用表单身份验证。调用构造函数时,我可以获取用户标识吗?