在ASP.NET 5上没有DI的情况下将对象附加到管道(或扩展HttpContext)

时间:2015-11-16 10:13:28

标签: c# asp.net-core asp.net-core-mvc

TL;博士 .-有没有办法在自定义类的HttpContext中包含属性(extend),就像有一个UserPrincipal的User属性一样?我想在所有管道中访问自定义类的HttpContext.MyOwnProperty(没有DI)。

长解释:

我已经在ASP.NET 5上创建了自己的身份系统,以摆脱框架中无法改变的身份系统,我已经厌倦了这个系统,并且摆脱了对索赔的使用,可能是非常标准化的,但是当你遇到很多这些标准时也是如此。

我使用一个类型化对象来表示用户访问,并从内存(或共享caché)存储库获取它,该存储库是在管道早期注册的服务,不知何故作为当前的UserManager。然后我通过将它的属性映射到我之前注册的作用域服务将这个对象传递给管道:

services.AddSingleton<AccessManager>();
services.AddScoped<CurrentAccess>();

一切正常,但我想知道是否有更有效的方法将CurrentAccess对象附加到管道,除了必须在每个地方注入和解析它,因为它在应用程序中广泛使用。 / p>

目标是扩展HttpContext类以添加CurrentAccess类型的属性,就像有一个UserPrincipal的User属性一样。那会很棒,但我不是知道怎么做。有什么想法吗?

(我还尝试了另一种方法,即使用HttpContext.Items属性,这是一个字典,我可以添加自己的对象,但我不知道它的生命周期,我不得不寻找我的项目和每次施展它,看起来比上一个选项更丑陋)

2 个答案:

答案 0 :(得分:1)

继续按照您的方式注册您的服务。

services.AddSingleton<AccessManager>();
services.AddScoped<CurrentAccess>();

然后创建一个返回HttpContext.GetCurrentAccess对象的CurrentAccess扩展方法:

public static class HttpContextExtensions
{
    public static CurrentAccess GetCurrentAccess(this HttpContext httpContext)
    {
        return httpContext.RequestServices.GetRequiredService<CurrentAccess>();
    }
}

这样,您可以在不希望在构造函数中注入CurrentAccess依赖项的地方使用扩展方法作为便捷方法。

public IActionResult Index()
{
    var currentAccess = this.Context.GetCurrentAccess();
    ...
    return View();
}

在有意义的情况下接受它,在其他地方使用便利扩展方法。

答案 1 :(得分:0)

  

有没有办法在自定义类的HttpContext中包含属性(extend),就像有一个UserPrincipal的User属性一样?我想在所有管道中访问自定义类的HttpContext.MyOwnProperty(没有DI)。

您无法向类添加属性。这将是一个很棒的C#功能,但是:)。