ASP.net MVC -Как использовать возможность Castle Windsor для разрешения объекта внутри вида - PullRequest
0 голосов
/ 13 сентября 2011

У меня есть требование, когда мне нужно позвонить в мою службу из моего поля зрения. У службы, которую мне нужно вызвать, есть зависимости от моих репозиториев.

Так что вместо того, чтобы делать как - IUserService _userService = new UserService (new UserRepository ());

Я хотел бы получить объект _userService из Windsor, поскольку он уже разрешил все зависимости.

Как мне этого добиться?


Вид, где мне нужно вызвать IUserService, - _layout.cshtml внутри Общей папки. Нет конкретного контроллера для этого. Так откуда же мне вводить зависимость?

Функциональность, которая мне нужна в представлении, заключается в проверке доступа на основе ролей, который я реализовал через UserService. У меня есть 2 варианта - 1. Либо использовать COntext.User.IsInRole внутри моего представления (которое не является тестируемым фрагментом кода). 2. Или вызвать мой UserService из представления (что подтверждается тестами). Мне пришлось выбрать меньшее из двух зол, поэтому я выбрал второй вариант.

Любые материалы будут высоко оценены.

1 Ответ

1 голос
/ 16 сентября 2011

Вы запросили ввод.ИМО, вы не должны делать звонки в хранилище из представления.

Я могу придумать два лучших варианта.

Вариант 1

Putроли пользователей в ViewModel, которую вы затем передаете представлению.Затем вы запрашиваете у ViewModel роли.

Опция 2

Вызовите ChildAction в вашем AccountController и верните частичное представление.Примерно так:

В вашем представлении:

Html.Action("GetUserRoles", "Account");

В вашем контроллере:

[ChildActionOnly]
[Transaction]
public PartialViewResult GetUserRoles(string userId)
{
   var viewModel = userService.GetRolesForUser(userId);
   return PartialView(viewModel);
}

Теперь вы можете просто внедрить IUserService через конструктор контроллера.IMO Appart из простых итераций и тому подобного, Views не должен содержать никакого кода, особенно кода доступа к данным.Вот и вся предпосылка паттерна MVC.

...