ASP.net MVC - 如何使用castle windsor的功能来解析视图中的对象

时间:2011-09-13 19:02:46

标签: asp.net-mvc castle-windsor

我有一个要求,我需要从我的视图内部调用我的服务。我需要调用的服务依赖于我的存储库。

所以不要这样做 -  IUserService _userService = new UserService(new UserRepository());

我想从Windsor获取_userService对象,因为它已经解析了所有依赖项。

我怎样才能做到这一点?


我需要调用IUserService的视图是共享文件夹中的_layout.cshtml。没有特定于此的控制器。那么我应该从哪里注入依赖?

我在视图中需要的功能是检查我通过UserService实现的基于角色的访问。我有2个选择 - 1.在我的视图中使用COntext.User.IsInRole(这不是一段可测试的代码) 2.或者从视图中调用我的UserService(测试支持)。 我不得不选择两个较小的罪恶,所以我选择了第二个选择。

任何输入都将受到高度赞赏。

1 个答案:

答案 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模式的全部前提。