繁体   English   中英

ASP.NET Core中的依赖注入抽象类

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM