簡體   English   中英

Nancy,TinyIoC-卡在盒子里

[英]Nancy, TinyIoC - Stuck in a Box

我已經使用Nancy已有一段時間了,我想我已經將自己放在盒子里了,無法在它外面思考,以至於看不到我在使用Nancy時所犯的錯誤。 我看到的選項我不太喜歡。 如果有某些功能我想念有人可以幫助我,或者我列出的替代方法不好,那么任何幫助將不勝感激。

問題設定

我正在創建一個小型Web應用程序,其中安裝了普通的燈具。 布局頁面和內容頁面,甚至還有一些局部視圖。

我想創建一個動態菜單系統,該系統將根據登錄的用戶來更改其菜單選項和常規布局。因此,主要工作是會計的用戶可能會看到更多的計費功能,計划的人可能會看到更多的調度功能,等等。

問題本身

問題是,使用Nancy和TinyIoC無法啟動動態菜單。

最初我以為,“我只是設置一個Menu模塊,然后設置RenderAction或同等功能,這樣我會很好的”,除了Nancy不喜歡這樣。 很好,因為我的替代方法是...在“布局”頁面上的代碼片段中與TinyIoC對話,它將解析我的IMenuManager,並且我可以在其中使用傳入的用戶ID或您擁有的名稱調用其GenerateMenu函數。 我將返回的對象傳遞給@ Html.Partial('path',model),我很高興

除非您真的不能以這種方式與TinyIoC交談。 除非它是Nancy Module本身的擴展,否則您將無法輕松訪問實現的解析接口。

我考慮過的其他選擇

  1. 我考慮過要使用JavaScript / jQuery對MenuModule進行AJAX調用並以這種方式獲取信息,但是這感覺很臟,因此我不喜歡它。
  2. 我考慮過的另一個其他選擇是,將所有出現的Page Models都封裝為PageModel.MenuModel和PageModel.RealPageModel。 這也真的很臟,我不是粉絲。

還有其他我沒有看到的選項嗎? 我是否必須放棄TinyIoC並以另一種方式重新實現整個過程?

正如您所提到的,我想您可以采用2種方法中的一種。

我傾向於使用前端框架來管理此類事情,對我來說,它是riot.js或vue.js,但是無論您使用的是Angular / react等,還是適用於同一件事。

基本上,您將調用終結點以返回json結果,這將查看用戶並調用工廠以根據用戶信息獲取菜單服務,然后菜單服務將負責創建結果模型菜單。 然后,客戶端將根據響應構建自己的視圖。


如果按每個請求將菜單下推,則可以使用RenderPartial進行類似的操作,該方法與基於服務結果的模型包含Menu和MenuView的方法相同。

使用工廠,創建/解析正確的服務,生成菜單,將該菜單以及其他所有內容附加到響應模型,然后渲染部分內容:

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

當然,從后端發回菜單布局更為優雅。 您將只有一個視圖。 這可能更容易實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM