【发布时间】:2018-09-13 03:10:27
【问题描述】:
在我的 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!
}
【问题讨论】:
-
我想你可以创建一个构造函数来请求依赖项,就像你可以对任何类做的那样?你试过吗?
-
你不能实例化抽象类,因此你不能用它来注册。你总是必须使用 concrete 类
-
@Tseng 您对 DI 不适用于抽象类的评论有参考吗?
-
@JayJayJay:C#(或一般的 OOP)基础知识。 abstract class。你想如何实例化抽象类?它只提供了一个基本的实现。要实例化它,您需要一个从基类继承的 concrete 类型/实现。因此,您需要一个一个地注册派生类。
-
.NET Core 的 DI (
Microsoft.Extensions.DependencyInjection) 不像其他 IoC 容器那样支持程序集或类型扫描,因此您不能在一次调用中注册“所有从 Y 派生的类型”。您必须使用反射、一些 LINQ(或 for/foreach 循环)来过滤它,然后在循环中注册派生类型。内置 IoC 旨在简单且开箱即用,您可以插入具有扩展功能的 3rd 方容器(例如从 Y 派生的扫描或自动注册类型)
标签: c# asp.net-core razor-pages