Nancy,TinyIoC - 陷入困境

时间:2016-07-01 04:08:01

标签: c# razor nancy

我现在已经使用Nancy一段时间了,我想我已经把自己变成了一个盒子而且不能在外面思考,看我在使用Nancy时的错误。我确实看到的选项我不太喜欢。如果有一些功能我错过了有人可以帮助我,或者我不能很好地列出任何帮助的替代方法将非常感谢。

问题设置

我正在创建一个小型的Web应用程序,我有正常的装置。布局页面和内容页面甚至几个部分视图浮动。

我想创建一个动态菜单系统,该系统会根据登录的用户更改其菜单选项和总体布局。因此,主要工作是会计的用户可能会看到更多的结算功能,安排的人可能会看到更多调度功能等。

问题本身

问题是,我在使用Nancy和TinyIoC获取动态菜单时遇到了困难。

最初我想,"我只是设置了一个菜单模块,RenderAction或同等版本,我会很高兴去除#南非,不过南希并不喜欢这个。这很好,因为我的替代方案是...在一个代码片段中的布局页面上与TinyIoC交谈,该代码片段将解析我的IMenuManager,我可以通过传入的用户ID调用其GenerateMenu函数或者你有什么。我将把返回的对象传递给@Html.Partial('路径',模型)并且我是金色的

除非你真的不能以这种方式与TinyIoC交谈。除非它是Nancy模块本身的扩展,否则您无法轻松访问Resolve an Interface to a implementation。

我考虑的其他选项

  1. 我考虑过使用JavaScript / jQuery对MenuModule进行AJAX调用并以这种方式获取信息,但这感觉很脏,而且我不喜欢这个。
  2. 我考虑过的另一个选项是使用PageModel.MenuModel和PageModel.RealPageModel包装所有Page Models。这也觉得很脏,而且我不是粉丝。
  3. 是否存在其他一些我没有看到的选项?我是否不得不放弃TinyIoC并以另一种方式重新实现整个事情?

2 个答案:

答案 0 :(得分:2)

我猜你可以采取两种方法中的一种,正如你所提到的那样。

我倾向于使用前端框架来管理这些类型的东西,对我来说它是riot.js或vue.js,但无论你是否使用角度/反应等同样的事情都适用

基本上你会调用一个端点来返回一个json结果,这会查看用户并调用工厂根据用户信息获取菜单服务,然后菜单服务将负责创建模型结果菜单。然后,客户端将根据响应构建自己的视图。

如果您在每次请求时按下菜单,可以使用RenderPartial执行类似操作,则方法与您的模型包含基于服务结果的菜单和MenuView的方法相同。

使用工厂,创建/解析正确的服务,生成菜单,将菜单附加到响应模型以及其他所有内容,然后渲染您的部分:

@Html.Partial(Model.MenuView, Model.Menu)

我将此方法用于我的个人项目。

如果您需要我进一步解释,请告诉我。

答案 1 :(得分:1)

如果你的需求不是太复杂,你可能会潜意识地试图使事情过于复杂。

你可以做一些像这样的观点:

@if (Html.RenderContext.Context.CurrentUser.IsAuthenticated())
{
    if (Html.RenderContext.Context.CurrentUser.Claims.Contains("Admin"))
    {
        @Html.Partial("Views/Partials/_AdminMenu")
    }
    else if (Html.RenderContext.Context.CurrentUser.Claims.Contains("Editor"))
    {
        @Html.Partial("Views/Partials/_EditorMenu")
    }
    else if (@Html.RenderContext.Context.CurrentUser.Claims.Contains("Viewer"))
    {
        @Html.Partial("Views/Partials/_ViewerMenu")
    }
    else
    {
        @Html.Partial("Views/Partials/_PublicMenu")
    }
}
else
{
    @Html.Partial("Views/Partials/_PublicMenu")
}

当然,从后端发回菜单布局更优雅。你只有一个视图。这可能更容易实现。