【问题标题】:Nancy, TinyIoC - Stuck in a BoxNancy, TinyIoC - 卡在盒子里
【发布时间】:2016-08-07 21:43:59
【问题描述】:

我使用 Nancy 已经有一段时间了,我认为我已经把自己变成了一个盒子,无法跳出它来思考我在使用 Nancy 时的错误。我确实看到的选项我不太喜欢。如果有一些我错过的功能,有人可以帮助我,或者我没有列出的替代方法,任何帮助将不胜感激。

问题设置

我正在创建一个小型 Web 应用程序,其中有正常的固定装置。布局页面和内容页面,甚至还有一些局部视图。

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

问题本身

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

最初我想,“我只需设置一个菜单模块,和 RenderAction 或等效的,我会很高兴的”,除了南希不喜欢这样。这很好,因为我的替代方案是......在代码 sn-p 的布局页面上与 TinyIoC 交谈,该代码将解析我的 IMenuManager,我可以在那里使用传入的用户 ID 或你有什么来调用它的 GenerateMenu 函数。我将获取返回的对象并将其传递给 @Html.Partial('path', model) 我是金子

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

我考虑过的其他选项

  1. 我曾考虑使用 JavaScript / jQuery 对 MenuModule 进行 AJAX 调用并以这种方式获取信息,但这感觉很脏,我不喜欢这样做。
  2. 我考虑过的另一个选项是使用 PageModel.MenuModel 和 PageModel.RealPageModel 包装所有向下的页面模型。这也觉得很脏,我不是粉丝。

还有其他一些我没有看到的选项吗?我是否将不得不放弃 TinyIoC 并以另一种方式重新实现整个事情?

【问题讨论】:

  • 不是,个人项目。
  • @un-lucky 我无法想象你为什么认为这是一个家庭作业......这显然是一个带着明确目标编写实际代码的人,他已经解释了问题域清楚地知道他们到目前为止所做的尝试......

标签: c# razor nancy


【解决方案1】:

我猜你可以采取 2 种方法中的一种,就像你提到的那样。

我倾向于使用前端框架来管理这些事情,对我来说它是 riot.js 或 vue.js,但无论您使用的是 angular/react 等,同样的事情都适用。

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


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

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

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

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

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

【讨论】:

  • 经过深思熟虑后,我将看看我能做什么并在 riot.js 上运行一段时间。我希望真正利用更多 Nancy/TinyIoC 的东西,并希望在我忽略的那些库中有些东西……但这很好。我最坏的情况是剥离 Nancy 并在 ASP.Net MVC 下重新制作网站,然后继续前进。
【解决方案2】:

如果您的需求不是太复杂,您可能会下意识地试图让事情变得过于复杂。

你可以这样做,这是你的看法:

@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")
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-12
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    相关资源
    最近更新 更多