我有一个要求,我需要从我的视图内部调用我的服务。我需要调用的服务依赖于我的存储库。
所以不要这样做 - IUserService _userService = new UserService(new UserRepository());
我想从Windsor获取_userService对象,因为它已经解析了所有依赖项。
我怎样才能做到这一点?
我需要调用IUserService的视图是共享文件夹中的_layout.cshtml。没有特定于此的控制器。那么我应该从哪里注入依赖?
我在视图中需要的功能是检查我通过UserService实现的基于角色的访问。我有2个选择 - 1.在我的视图中使用COntext.User.IsInRole(这不是一段可测试的代码) 2.或者从视图中调用我的UserService(测试支持)。 我不得不选择两个较小的罪恶,所以我选择了第二个选择。
任何输入都将受到高度赞赏。
答案 0 :(得分:1)
你要求输入。 IMO您不应该从视图中调用存储库。
我可以想到两个更好的选择。
选项1
将用户角色放入ViewModel,然后将其传递给视图。然后查询ViewModel以获取角色。
选项2
在AccountController上调用ChildAction并返回部分视图。 像这样:
在您的视图中:
Html.Action("GetUserRoles", "Account");
在您的控制器中:
[ChildActionOnly]
[Transaction]
public PartialViewResult GetUserRoles(string userId)
{
var viewModel = userService.GetRolesForUser(userId);
return PartialView(viewModel);
}
现在您可以通过Controller构造函数注入IUserService。 IMO Appart从简单的迭代和类似的东西,视图不应包含任何代码,尤其是不包含数据访问代码。这是MVC模式的全部前提。