【发布时间】:2018-07-15 01:10:24
【问题描述】:
我开发了一个 ASP.NET Core 中间件。我在这篇文章中简化了中间件,让问题更清晰。
中间件在Startup.cs中配置如下:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
...
app.UseMyMiddleware(42);
...
}
整数(42)存储在中间件实例中,一切正常。
现在我想创建一些辅助方法作为扩展方法:
public static int Add(this int i)
{
return i + TODO;
}
我想要将i 的值添加到发送到中间件的值(42)的方法。
目前我已将42 的值保存在中间件内的公共静态变量中,并通过我的扩展方法访问它:
public static int Add(this int i)
{
return i + MyMiddleware.Value;
}
出于各种原因,我不喜欢这个解决方案。任何关于如何以更好的方式解决此问题的想法都将受到高度赞赏。
【问题讨论】:
-
您可以将中间件类实例添加到 IoC 容器中,并在需要时使用注入来获取对它的引用。
-
这样的扩展方法不会有太大的成功。你不能用它解决任何非静态的东西,而且 ASP.NET Core 按设计 避免了静态。正确的方法是创建某种需要通过依赖注入来解决的帮助程序。 ——话虽如此,这究竟是一种什么样的价值?这是一个特定于请求的值(那么静态无论如何都是错误的方法)还是真的只是构造一次?它是在您的代码中固定的常量,还是来自配置?
-
@poke 每个应用程序的值确实是静态的,并且只创建一次。能够在 config 中指定值并将其注入到各个地方(如其他推荐和答案中所建议的那样)肯定会改进代码。但它不会使扩展方法中的值可用。
-
@poke 如果你想看一些真实的代码,这是我做的一个 PR,实现了静态变量(我不喜欢):github.com/elmahio/Elmah.Io.AspNetCore/pull/2
标签: c# asp.net-core asp.net-core-2.0 asp.net-core-middleware