考虑以下ASP.NET Core项目/类结构:
Request comes in
Middleware
Controller [calls]
BusinessLayer
BusinessRules
HelperClasses
DomainSpecificClass
etc..
当有请求进入时,我想在中间件组件中设置一些值,并在DomainSpecificClass中为特定请求提供这些值。我想,我可以通过依赖注入和方法参数的组合来获取这些值,但是我想知道是否有更简单的方法。
就像是:
// middleware class
public async Task Invoke(HttpContext context) {
// RequestContext is a made up class
RequestContext.Referrer = context.Request.Headers["Referer"].ToString();
}
// DomainSpecificClass
private void DoStuff() {
string referrer = RequestContext.Referrer;
}
.NET Core中是否可以实现这种类型的实现?
您可以创建一个类,该类将提供来自“当前”请求的所需数据,并在DI中将其注册为“范围”-每个请求一个实例。
public interface ICurrentRequest
{
string Referrer();
}
public class CurrentRequest : ICurrentRequest
{
private readonly IHttpContextAccessor _contextAccessor;
public CurrentRequest(IHttpContextAccessor contextAccessor)
{
_contextAccessor = contextAccessor;
}
public string Referrer()
{
return _contextAccessor.HttpContext.Request.Headers["Referer"].ToString();
}
}
使用ASP.NET内置的DI容器将实现注册为“作用域”
services.AddHttpContextAccessor(); // Built-in extension method
services.AddScoped<ICurrentRequest, CurrentRequest>();
在业务层中使用它
public class DomainSpecificClass
{
private readonly ICurrentRequest _currentRequest;
public DomainSpecificClass(ICurrentRequest currentRequest)
{
_currentRequest = currentRequest;
}
private void DoStuff()
{
var referrer = _currentRequest.Referrer();
}
}
ICurrentRequest
抽象可以在业务层中声明,因此应用程序的任何主机都可以实现抽象,并且业务逻辑将不依赖于“ Http”抽象。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句