gpt4 book ai didi

c# - 抽象类中的依赖注入(inject),ASP.NET Core

转载 作者:行者123 更新时间:2023-11-30 14:46:19 28 4
gpt4 key购买 nike

在我的 ASP.NET Core 2 项目中,我创建了继承 RazorPage 类的新类,以在 View 中添加一些额外的属性。

public abstract class WebViewPage<TModel> : Microsoft.AspNetCore.Mvc.Razor.RazorPage<TModel>
{
public string Version
{
get
{
return "1.00.100";
}
}
public User CurrentUser
{
get
{
//challenge is here:
//return _services.GetRequiredService<IUserService>().GetCurrentUser();
}
}
}

public abstract class WebViewPage : WebViewPage<dynamic>
{

}

_ViewImport.cshtml 文件更改为:

@inherits MyProject.WebViewPage<TModel>
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

在挑战代码被标记为评论之前,该项目运行良好。但是,我怎样才能将依赖项注入(inject)抽象类呢?或者如何在抽象类中解析服务?

这是我的 StartUp.cs 文件:

public void ConfigureServices(IServiceCollection services)
{
services.AddMemoryCache();
services.AddMvc();
services.AddTransient<IUserService, UserService>();
//services.AddScoped<IRazorPage<?>, WebViewPage<?>(); // ?: challenge!
}

最佳答案

如果您需要访问 Razor 页面内的服务提供商,您可以访问 HttpContext通过 Context property ,例如:

var userService = Context.RequestServices.GetRequiredService<IUserService>();

一个可能更好的选择是有一个构造函数接受 IUserService作为依赖。因此,您的类型的实现必须传递该依赖项,本质上要求它们具有自己的构造函数依赖项(这是一个很好的显式设计)。


至于依赖注册部分,注意一般不能注册抽象类,因为抽象类不能被实例化。

但一般来说,为了注册一个通用类型,你必须使用更冗长的重载 AddScoped这需要实际 Type参数:

services.AddScoped(typeof(IRazorPage<>), typeof(WebViewPage<>)); 

进行泛型方法调用需要一个真实类型作为泛型类型参数,因此您必须为类型参数指定一个具体类型 T里面IRazorPage<T>WebViewPage<T> .由于您明确不想在那里使用具体类型,而是想告诉依赖注入(inject)容器支持任何类型,因此您不能在那里使用此语法。

typeof运算符可以确定实际的 generic 类型,您可以使用它而无需使用特定类型参数,这会将注册限制为单一类型。

关于c# - 抽象类中的依赖注入(inject),ASP.NET Core,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49636043/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com