我正在努力将 ASP.NET 4.6 框架代码迁移到 .NET Core。我目前还处于学习阶段。我是 MVC 新手,因为我一直使用 WebForms,但我想放弃 WebForms。我也是 ASP.NET Core 的新手。
基本上,我有一个类库来完成我的大部分工作 - 使我免于在多个页面甚至网站上重复代码(数据库、会话、自定义身份管理)。我将 DLL 添加到项目中,然后就可以使用了。
我发现 ASPNET Core 不太允许这样做。也许我不理解它,或者现在开始移植它还为时过早。
我需要能够访问类库中的 HttpContext 来操作会话、cookie 等。解决这个问题最简单的方法是什么?我想一旦我能做到这一点,我就能开始取得更好的进步。
或者,我需要重新考虑编写类库吗?根据我的理解,我需要编写中间件来完成此任务。但我能找到的每个例子要么不完整,要么已经过时了。
欢迎任何建议。
使用
HttpContext
进行全面逻辑并不是一个好主意,但如果你真的打算这样做,只需坚持 SOLID 原则之一,即。 依赖倒置原理.
ASP.NET MVC 及其后继者 ASP.NET Core 的基础正是基于这一原则。 将
IHttpContextAccessor
注入到类库中需要它的任何类的构造函数中。
public class ContextHelper
{
private IHttpContextAccessor _httpContextAccessor;
public ContextHelper(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public void DoStuff()
{
DoOtherStuffWith(_httpContextAccessor.HttpContext);
}
}
记住将其注册到默认 IoC 容器中的
Startup
中,如下所示:
public class Startup
{
// Rest of the class here...
public void ConfigureServices(IServiceCollection services)
{
// Other registrations here...
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}
}
Step1:在启动类 -> 在ConfigureServices中添加以下行
services.AddHttpContextAccessor();
Step2:在你的班级库中。例如。
public class Dog
{
public HttpContext _httpContext => new HttpContextAccessor().HttpContext;
public void Speak()
{
_httpContext.Response.WriteAsync("Dog says: Bow-Wow...\n");
}
}
在 asp.netcore mvc 中,
HttpContext
在控制器范围之外不可访问。因此,您无法直接访问类库中的HttpContext
。您必须通过其他方式访问它。
您可以将
HttpContext
发送到您的类库,或者从控制器的构造函数发送到类库类的构造函数,或者从控制器的操作方法发送到需要当前 HttpContext
的特定库方法。