如何在 _viewimports 文件中注入依赖项

3
我正在尝试生成一个通用的BaseViewPage,在asp.net Core中访问当前用户的身份信息。
为此,我创建了一个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 没有提供与“BaseViewPage.BaseViewPage(IPrincipal)”的所需形式参数'_principal'对应的参数 MyStore D:\ Projects \ TWCStore \ TWCStore \ Views \ Store \ ProductCategories.cshtml 1 Active

我认为当我注入依赖项时,它希望我在这里也将IPrincipal作为依赖项。
 @inherits MyStore.Helpers.BaseViewPage<TModel>

我怎样在这里注入这个依赖?


你尝试过在 startup.cs 中注册吗? - XamDev
1
ClaimsPrincipal不是已注册的依赖项,身份验证中间件会在每个请求中从auth cookie创建principal。您无需注入它,因为它已经在视图中可用。用户属性在视图中本质上是可用的,并且是ClaimsPrincipal。 - Joe Audette
最好不要创建带有构造函数依赖项的基本页面,因为您可以在视图内部使用@inject来获取注入的内容。 - Joe Audette
_viewimports 只是为了使命名空间和标签助手在其他视图中全局可用,除此之外不应尝试进行其他操作。 - Joe Audette
@JoeAudette,在所有情况下,如果我不注入它,我都会得到空的ClaimsPrincipal。请告诉我如何在不注入的情况下获取声明?此外,我的问题是通过注入接口而不是继承来解决的。我应该在空闲时间更新问题。 - Manoz
1个回答

4

很晚了,我在这里写下(实际上是一种替代)解决该问题的方案。

所以我遵循了依赖注入(抱歉现在忘记了帮助链接)。

以下是我所做的:

创建一个接口

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文件的“ConfigureServices”部分注册该服务。
 services.AddTransient<IAppUserAccessor, AppUserAccessor>();

在 _viewimports.cshtml 中注入

@using MyApplication
@inject MyApplication.Helpers.IAppUserAccessor AppUserAccessor

现在这可以在每个视图中访问 -
@AppUserAccessor.MemberId

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接