2017-08-16 68 views
0

我想在asp.net Core中生成一個通用的BaseViewPage來訪問當前用戶的標識。如何在_viewimports文件中注入依賴關係

爲此,我創建了一個BaseViewPage.cs文件 -

public abstract class BaseViewPage<TModel> : RazorPage<TModel> 
    { 
     private static ClaimsPrincipal principal; 
     public BaseViewPage(IPrincipal _principal) 
     { 
      principal = _principal as ClaimsPrincipal; 
     } 
    } 

正如你可以在這裏構造我注射,這樣它能夠在運行時定義IPrincipal類型的依賴看到。

現在的時間來繼承它_viewimports.cshtml文件中的所有視圖頁面,如下使用當前用戶 -

@using TWCStore 
@inherits MyStore.Helpers.BaseViewPage<TModel> 
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers 

每當我試着在我看來,使用任何財產 - ProductCategories.cshtml錯誤這裏調用

嚴重性代碼說明項目文件的線路抑制狀態 錯誤CS7036沒有給定參數對應於 「BaseVie的 需要的形式參數「_principal」 wPage.BaseViewPage(IPrincipal的)」的MyStore d:\項目\ TWCStore \ TWCStore \查看\店\ ProductCategories.cshtml 1活動

我,當我注入那麼依賴它要我把IPrincipal的假設這裏也依賴於 -

@inherits MyStore.Helpers.BaseViewPage<TModel> 

如何在這裏注入這種依賴關係?

+0

你嘗過startup.cs註冊? – Rohit

+1

ClaimsPrincipal沒有註冊依賴注入的東西,認證中間件從每個請求的auth cookie創建主體。你不需要注入它,因爲它已經在視圖中可用。用戶屬性本質上是在視圖中可用的,並且是ClaimsPrincipal –

+0

也可能最好不創建帶有構造函數依賴項的basepage,因爲您可以在視圖內部使用@inject來注入事物 –

回答

1

其後我寫這個問題的解決方案(實際上是替代方案)。

因此,我遵循依賴注入(遺憾的是現在忘記幫助鏈接)。

這裏是我做過什麼 -

下 'ConfigureServices' 部分創建一個接口

public interface IAppUserAccessor 
    { 
     int MemberId { get; } 
    } 

解析器類

public class AppUserAccessor : IAppUserAccessor 
    { 
     private readonly MyContext _context; 
     public AppUserAccessor(MyContext context) 
     { 
      _context = context; 
     } 

     int IAppUserAccessor.MemberId 
     { 
      get 
      { 
       return _context.Member.MemberId; 
      } 
     } 
    } 

註冊在StartUp.cs服務

services.AddTransient<IAppUserAccessor, AppUserAccessor>(); 

進樣在_viewimports.cshtml

@using MyApplication 
@inject MyApplication.Helpers.IAppUserAccessor AppUserAccessor 

現在,這是每個視圖訪問 -

@AppUserAccessor.MemberId 
相關問題