2017-08-16 69 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 
相关问题