[英]Dependency Injection in abstract class, ASP.NET Core
在我的ASP.NET Core 2项目中,我创建了一个继承RazorPage类的新类,以在视图中添加一些额外的属性。
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
该项目工作正常,直到挑战代码被标记为评论。 但是,我如何将依赖项注入抽象类? 或者如何在抽象类中解析服务?
这是我的StartUp.cs
文件:
public void ConfigureServices(IServiceCollection services)
{
services.AddMemoryCache();
services.AddMvc();
services.AddTransient<IUserService, UserService>();
//services.AddScoped<IRazorPage<?>, WebViewPage<?>(); // ?: challenge!
}
如果您需要访问剃刀页面内的服务提供程序,可以通过Context
属性访问HttpContext
,例如:
var userService = Context.RequestServices.GetRequiredService<IUserService>();
一个可能更好的选择是拥有一个将IUserService
作为依赖项的构造函数。 因此,您的类型的实现必须传递该依赖,实质上要求它们自己具有构造函数依赖(这使得一个良好的显式设计)。
至于依赖注册部分,请注意您通常无法注册抽象类,因为它们无法实例化。
但是一般来说,为了注册泛型类型,你必须使用更详细的AddScoped
重载,它接受实际的Type
参数:
services.AddScoped(typeof(IRazorPage<>), typeof(WebViewPage<>));
进行泛型方法调用需要将实类型作为泛型类型参数,因此您必须在IRazorPage<T>
和WebViewPage<T>
为类型参数T
指定具体类型。 由于您明确地不想在那里使用具体类型,而是想要告诉依赖注入容器支持任何类型,因此您不能在那里使用此语法。
由于typeof
运算符可以确定实际的泛型类型,因此您可以使用它而无需使用特定的类型参数,这会将注册限制为单个类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.