在我的MVC5应用程序中,如果用户没有权限,则某些视图组件不会在RAZOR中呈现。
使用Repository模式获取权限,该模式与我的应用程序的其余部分完全异步。
我已经实施了一个具有以下方法的IPermission服务
public interface IPermissionService
{
Task<bool> IsUserAllowed(string moduleName, string action);
Task<bool> IsUserAdmin();
}
现在,为了能够在我的视图中使用此服务,我编写了一个自定义View Base,它继承自WebViewPage,如下所示:
public abstract class ViewBase<T> : WebViewPage<T> where T : class
{
public IPermissionService Permissions;
public override void InitHelpers()
{
base.InitHelpers();
Permissions= DependencyResolver.Current.GetService<IPermissionService>();
}
public override void Execute()
{
}
}
我无法在我的View中使用这些异步函数,因为等待在那里工作。我不想创建数据存储库的单独的非异步实现。另外,我觉得在没有等待的情况下调用异步函数可以执行类似Task.Result()的操作,根据call async method without await #2
也不是一个好主意有更好的方法吗?
答案 0 :(得分:0)
您可以尝试将这些资源的加载与加载视图分开。
您的视图本身应该加载所有用户都有权限的所有项目。
当视图在客户端呈现时,将异步ajax调用发送回服务器上的Action,该Action将评估用户有权查看的内容,并返回适当的数据/模型以进行客户端加载。 / p>
这样您就不必担心在视图中运行异步服务器代码,并且仍然可以完全控制用户可以看到的内容(也是异步)
答案 1 :(得分:0)
这似乎是依赖注入的一个很好的候选者。例如,查看Autofac关于财产注入的建议:
http://docs.autofac.org/en/latest/integration/mvc.html#enable-property-injection-for-view-pages