2016-09-14 77 views
2

我喜欢在我的应用程序中为常见的管道工具(如检查角色或Razor Html助手等等)提供静态助手类......但您如何在DI世界中执行此操作?在dotnetcore DI世界中使用助手

像可以说,我希望有一个扩展的辅助检查,如果用户是管理员

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

所以前核心,我可以不理会DI和创造的UserManager里面所有IsAdmin做我需要做的。但是现在有没有办法让这些助手中的UserManager仅仅使用?我能看到的唯一方法是将其注入到控制器中,然后传入方法中(我觉得这很丑陋)。然后是在Razor视图中尝试执行user.IsAdmin()的问题,是否需要将UserManager添加到ViewData集合以将其添加到视图标记中?

我在这里错过了什么吗?

谢谢你,史蒂夫

回答

1

首先,如果你刚才问如何使用静态类与迪,我会说你的问题是重复的How to use DI inside a static Method in Asp.net Core rc1

但是,正如我看到的,你还有其他问题?

但是现在有没有办法让这些帮助程序中的UserManager以 的方式使用?

是的,有一种方式:Service Locator模式。但它是一个反模式(see this article)。尽可能避免使用这种模式。另请参阅github中的discussion

我能看到的唯一方法是将其注入到控制器,然后通过 一起到方法(我觉得这丑陋的)

我觉得这种方式比你想更好的。我更喜欢这个。

再有就是要在这个剃刀 视图做user.IsAdmin()的问题,我需要到的UserManager添加到收藏的ViewData到 得到它到视图中的标记?

在Aspnet内核中,您可以在视图中注入依赖项,因此不需要使用ViewData。您只需将UserManager注入您的视图,然后将其作为参数传递给方法即可。看看official docs

1

嗯,你是在谈论这里横切关注点和一个方式如何我已经看到了ASP.NET MVC核心解决横切关注点是属性(如[授权]为例)。我认为这是一个优雅的解决方案。

所以,如果我正确理解你的问题,我想你可以用Action Filter来解决这个问题。 Damien Bod前几天介绍了如何使用ActionFilters:https://damienbod.com/2016/09/09/asp-net-core-action-arguments-validation-using-an-actionfilter/

简而言之,您从ActionFilterAttribute继承并创建自己的curstom过滤器,称为MyCustomFilter或其他。让这个MyCustomFilter通过DI在其构造函数中请求UserManager。然后在上面控制器的任何操作方法,你说:

ServiceFilter[typeof(MyCustomFilter)] 

而且在MyCustomFilter你ofcourse有逻辑来检查,如果用户是IsAdmin,然后采取相应的行动。现在,我一直使用微软的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手指交叉...