Nancy,TinyIoC - 卡在盒子里

Nancy, TinyIoC - Stuck in a Box

我已经使用 Nancy 一段时间了,我想我已经把自己困在了一个盒子里,无法跳出它来思考我在使用 Nancy 时的错误。我确实看到的选项我不太喜欢。如果我遗漏了一些可以帮助我的功能,或者我没有很好地列出的替代方法,我们将不胜感激。

问题设置

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

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

问题本身

问题是,我很难使用 Nancy 和 TinyIoC 启动动态菜单。

本来我想,"I'll just setup a Menu module, and RenderAction, or equivalent, and I'll be good to go",只是南希不喜欢这样。这很好,因为我的替代方案是......在代码片段中的布局页面上与 TinyIoC 对话,该代码片段将解析我的 IMenuManager 并且我可以在那里调用它的 GenerateMenu 函数并传入用户 ID 或者你有什么。我将获取返回的对象并将其传递给 @Html.Partial('path', model) 我是 golden

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

我考虑过的其他选择

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

是否存在其他一些我没有看到的输出选项?我是否必须放弃 TinyIoC 并以另一种方式重新实现整个事情?

我想您可以采用您提到的两种方法中的一种。

我倾向于使用前端框架来管理这些事情,对我来说它要么是 riot.js 要么是 vue.js,但是无论你是否使用 angular/react,等等

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


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

使用工厂,create/resolve 正确的服务,生成菜单,将菜单连同其他所有内容附加到响应模型,然后呈现您的部分:

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

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

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

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

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

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

当然,后台传回菜单布局更优雅。您将只有一个视图。这可能更容易实施。