System.Web 适配器库使 ASP.NET Framework 应用程序能够使用 .NET 泛型主机模式,将新式应用程序基础结构功能引入传统 ASP.NET 框架项目。 此方法提供对新式 .NET 应用程序中标准的依赖项注入、日志记录、配置和其他服务的访问权限,同时保持与现有 ASP.NET Framework 代码的兼容性。
为何使用主机模式
在 ASP.NET Framework 应用程序中采用泛型主机模式提供了几个主要优势:
- 依赖项注入:访问新式 .NET 中使用的内置依赖项注入容器,从而实现更好的可测试性、可维护性和关注点分离
-
统一日志记录:与
Microsoft.Extensions.Logging应用程序集成,提供一致的日志记录体验并访问各种日志记录提供程序 - 新式配置:使用新式 .NET 中的配置系统,包括对 JSON 文件、环境变量、用户机密和其他配置源的支持
- 迁移路径:通过以增量方式采用新式模式来准备迁移到 ASP.NET Core 的代码库,同时维护现有的 ASP.NET Framework 应用程序
- 服务默认值:利用新式 .NET 应用程序中常用的服务默认值和标准化应用程序基础结构模式
设置通用主机
若要在 ASP.NET Framework 应用中配置通用主机模式,请在 Global.asax.cs 文件的 Application_Start 方法中注册主机。
using System.Web;
using Microsoft.AspNetCore.SystemWebAdapters.Hosting;
using Microsoft.Extensions.Hosting;
namespace MvcApp
{
public class MvcApplication : HttpApplication
{
protected void Application_Start()
{
HttpApplicationHost.RegisterHost(builder =>
{
builder.AddServiceDefaults();
builder.AddSystemWebDependencyInjection();
builder.AddSystemWebAdapters();
});
// Existing ASP.NET Framework configuration
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
}
该方法 HttpApplicationHost.RegisterHost 配置与 ASP.NET Framework 应用程序一起运行的泛型主机。 主机生成器通过添加各种功能的扩展方法接受配置。
依赖项注入
注释
该适配器目前处于预览版本。 必须使用 2.2.0-preview1.25554.5 或更高版本才能使用此功能。
该方法 AddSystemWebDependencyInjection 在整个 ASP.NET Framework 应用程序中启用依赖项注入。 向通用主机的服务集合注册的服务可供控制器、处理程序和其他组件使用。
此扩展方法是一种内部方法,将根据你引用的内容生成源。 支持以下框架:
- 使用 WebForms 和处理程序 WebObjectActivator
- 使用 ASP.NET MVC DependencyResolver
- ASP.NET WebApi 使用 DependencyResolver
注册服务
通过访问主机生成器上的 Services 属性,将服务注册到依赖注入容器中:
HttpApplicationHost.RegisterHost(builder =>
{
builder.AddSystemWebDependencyInjection();
builder.AddSystemWebAdapters();
builder.Services.AddScoped<IMyService, MyService>();
builder.Services.AddSingleton<IDataRepository, DataRepository>();
});
有关如何自定义依赖项注入系统(包括替换服务容器)的详细信息,请参阅完整文档: ASP.NET Core 中的依赖项注入。
如果当前在 ASP.NET Framework 中重写依赖注入钩子,您将需要更新为最新的依赖注入模式,并删除用于 WebForms/MVC4/WebAPI 的现有集成。
使用服务
注册后,可将服务注入到支持依赖项注入的 MVC 控制器、Web API 控制器和其他组件中:
public class HomeController : Controller
{
private readonly IMyService _myService;
private readonly ILogger<HomeController> _logger;
public HomeController(IMyService myService, ILogger<HomeController> logger)
{
_myService = myService;
_logger = logger;
}
public ActionResult Index()
{
_logger.LogInformation("Loading home page");
var data = _myService.GetData();
return View(data);
}
}
在请求中,可以通过特殊扩展方法检索范围范围内的服务集:
var myService = HttpContext.Current.GetRequestServices().GetService(typeof(ISomeType));
警告
HttpContext 实现 IServiceProvider ,因此你可能会看到用于从中获取服务的扩展方法。 但是,它不是为了从已注册的容器中检索任何有用的服务而实现的。 如果您尝试使用它,您将看到一个错误,相反,您应该首先使用GetRequestServices()扩展方法。
伐木业
通用主机集成 Microsoft.Extensions.Logging,为 ASP.NET Framework 应用程序提供新式日志记录基础结构。
使用记录器
将 ILogger<T> 注入到你的类中以记录消息:
public class OrderService : IOrderService
{
private readonly ILogger<OrderService> _logger;
public OrderService(ILogger<OrderService> logger)
{
_logger = logger;
}
public void ProcessOrder(int orderId)
{
_logger.LogInformation("Processing order {OrderId}", orderId);
try
{
// Process order logic
_logger.LogDebug("Order {OrderId} processed successfully", orderId);
}
catch (Exception ex)
{
_logger.LogError(ex, "Error processing order {OrderId}", orderId);
throw;
}
}
}
有关自定义和使用日志记录的详细信息,包括与自己的提供程序集成,请参阅 .NET 中的日志记录和 ASP.NET Core。
配置
通用主机支持新式 .NET 配置系统,包括 JSON 文件、环境变量和其他配置源。 默认情况下,使用HttpApplicationHost标准配置模式(如appsettings.json和appsettings.{Environment}.json),并自动包含与AppSettingsConnectionStrings现有 ASP.NET Framework 应用程序兼容的值。
访问配置
注入 IConfiguration 以访问配置值:
public class EmailService : IEmailService
{
private readonly string _smtpServer;
private readonly ILogger<EmailService> _logger;
public EmailService(IConfiguration configuration, ILogger<EmailService> logger)
{
_smtpServer = configuration["Email:SmtpServer"];
_logger = logger;
}
public void SendEmail(string to, string subject, string body)
{
_logger.LogInformation("Sending email to {Recipient} via {SmtpServer}", to, _smtpServer);
// Email sending logic
}
}
对于无法使用依赖项注入的代码,请使用静态 AppConfiguration 帮助程序类访问配置值:
using Microsoft.AspNetCore.SystemWebAdapters;
var configValue = AppConfiguration.GetSetting("SomeSettings");
var connStr = AppConfiguration.GetConnectionString("connection-string-name");
这将适用于引用 Microsoft.AspNetCore.SystemWebAdapters 的 ASP.NET Core 和 ASP.NET Framework 应用程序,并提供对当前 IConfiguration 的访问权限。
使用选项模式
选项模式提供对配置部分的强类型访问:
public class EmailSettings
{
public string SmtpServer { get; set; }
public int Port { get; set; }
public string Username { get; set; }
}
// Register options
HttpApplicationHost.RegisterHost(builder =>
{
builder.Services.Configure<EmailSettings>(
builder.Configuration.GetSection("Email"));
builder.AddSystemWebDependencyInjection();
builder.AddSystemWebAdapters();
});
// Consume options
public class EmailService : IEmailService
{
private readonly EmailSettings _settings;
private readonly ILogger<EmailService> _logger;
public EmailService(IOptions<EmailSettings> options, ILogger<EmailService> logger)
{
_settings = options.Value;
_logger = logger;
}
}
有关高级配置方案,包括自定义配置源和环境特定的设置,请参阅 ASP.NET Core 中的配置。
迁移策略
小型项目可能不需要完全转换为通用主机模式,但可以使大型项目的迁移更加容易。 如果您已成功转换为使用此功能,则可以在 ASP.NET Core 中将 HttpApplicationHost 的使用替换为 WebApplication。
迁移到此设置时,小型增量更改将有助于确保成功转换。 建议在此进行迁移的顺序如下:
添加初始主机注册:
HttpApplicationHost.RegisterHost(builder => { });更新以使用 Microsoft 扩展依赖注入:
HttpApplicationHost.RegisterHost(builder => { builder.AddSystemWebDependencyInjection(); });在执行此操作时,可能需要根据容器自身的文档对其进行调整,以便与 Microsoft 扩展库的依赖注入集成。
确定日志记录系统并将其集成到Microsoft扩展日志记录基础结构中。 确定是否要继续使用现有系统中的记录器类型或迁移到
ILogger<>HttpApplicationHost 将提供的类型。将所有调用AppSettingsConnectionStrings替换为新的等效
AppConfiguration调用。 必须在要实现此操作的项目中引用Microsoft.AspNetCore.SystemWebAdapters。开始使用选项模式将配置转换为 POCO,并通过集成 DI 系统将其传递给需要的服务。
将您的设置从
web.config移动到appsettings.json