2016-09-14 3 views
2

Мне нравится иметь статические классы-помощники в моих приложениях для обычных материалов для сантехники, например, проверки роли или помощников Razor Html и т. Д. ... но как вы это делаете в мире DI?Работа с помощниками в мире dotnetcore DI

Как позволяет сказать, что я хочу к помощнику расширение, чтобы проверить, если пользователь является администратором

public static async Task<bool> IsAdmin(this ApplicationUser user) 
... 
if(user.IsAdmin()){...} 

Так до ядра я мог бы просто игнорировать DI и создать UserManager все внутри IsAdmin делать все, что мне нужно сделать. Но теперь нет способа заставить UserManager в этих помощниках просто использовать? Единственный способ, который я вижу, - ввести его в контроллер, а затем перейти к методу (который я считаю уродливым). Тогда возникает проблема с попыткой сделать user.IsAdmin() в представлении Razor, нужно ли мне добавить UserManager в коллекцию ViewData, чтобы получить его в виде разметки?

Я просто что-то пропустил?

Спасибо, Стив

ответ

1

Прежде всего если вы просто спросили, как использовать статический класс с di, я бы сказал, что ваш вопрос дублируется How to use DI inside a static Method in Asp.net Core rc1

Но, как я вижу, у вас есть другой вопрос?

Но теперь нет способа получить UserManager в этих помощниках до просто использовать?

Да Есть способ: Service Locator Узор. Но это анти-шаблон (see this article). Насколько это возможно, вам следует избегать использования этого шаблона. Также см. discussion в github.

Единственный способ, которым я могу видеть это, чтобы ввести его в контроллер, а затем передать вместе в метод (который я считаю некрасиво)

Я думаю, что этот путь лучше, чем вы хотите. Я бы предпочел это.

Тогда есть вопрос о попытке сделать user.IsAdmin() по мнению Бритва , мне нужно, чтобы добавить UserManager в коллекцию ViewData , чтобы получить его в разметке?

В ядре Aspnet вы можете вставлять зависимость в представление, поэтому вам не нужно использовать ViewData. Просто вы можете ввести UserManager в свое представление, а затем передать его как параметр в метод. Взгляните на official docs

1

Ну вы говорите о сквозной озабоченности здесь и так как я видел крест проблемы режущей решаемую в ASP.NET MVC ядра является атрибутами (например, [Авторизоваться] для пример). Я думаю, что это элегантное решение.

Итак, если я правильно понял ваш вопрос, я думаю, вы можете решить это с помощью фильтра действий. Damien Bod описал несколько дней назад, как использовать ActionFilters: https://damienbod.com/2016/09/09/asp-net-core-action-arguments-validation-using-an-actionfilter/.

Итак, вы наследуете ActionFilterAttribute и создаете свой собственный фильтр curstom под названием MyCustomFilter или что-то еще. Попросите MyCustomFilter запросить UserManager в его конструкторе через DI. Тогда выше любого метода действия в контроллере вы говорите:

ServiceFilter[typeof(MyCustomFilter)] 

И MyCustomFilter вы конечно иметь логику, чтобы проверить, если Пользователь IsAdmin, а затем принять соответствующие меры.

Теперь я всегда использовал Microsoft Unity для решения проблем перекрестных связей через перехват (вы можете узнать больше об этом здесь: https://dannyvanderkraan.wordpress.com/2015/09/30/real-world-example-of-adding-auditing-with-dependency-injections-interception/. Но в прошлый раз, когда я проверил, для ядра asp.net еще нет контейнера Unity. парень имеет большую статью о переносе его в ядро:. https://dzimchuk.net/post/bring-your-own-di-container-to-aspnet-5-unity Я действительно хотел бы мой Перехват обратно Очень элегантное решение Сквозные проблемы они работают над этим, хотя:.. https://github.com/unitycontainer/unity/issues/66 Пальцы скрещены ...

Смежные вопросы