将对象从 HttpModule 传递到应用程序

Pass objects to application from HttpModule

有没有办法在 HTTP 模块中创建对象并将这些对象传递给应用程序。

我可以使用HTTPContext.Items。但这意味着我将在将使用这些数据的应用程序中的任何 DLL 中引用 System.Web。 Utility.dll 正在读取由 http 模块生成的数据,我不想在该 DLL 中引用 System.Web,因为 Web 和桌面应用程序都使用它。 当然桌面应用程序不会找到该对象,这不是问题。

您可以在 System.Runtime.Caching 中使用新的可扩展缓存 API,即 MemoryCache class。只需使用共享常量作为名称即可。

我认为您的网络模块应该与 Utility.dll 通信,而不是相反。它应该使用它需要的数据调用 Utility.dll 中的一个函数。由于我们不太了解您的应用程序的性质,并且您没有提供太多有关您希望不同模块如何通信的信息,因此很难给出明确的答案。

Utility.dll 模块可以有一个接受数据的方法,例如

public void QueueProcessingData(YourDataType[] data) {/* ... */}

如果你真的想让你的 Utility.dll 模块从网络服务器中提取数据,那么你可以像@Ricardo Peres 说的那样使用内置缓存。使用内置 MemoryCache 的示例:

var data = "object your web module created and you want to pass to utility.dll";
ObjectCache cache = MemoryCache.Default;
cache.Add("The name you want", data, new CacheItemPolicy { AbsoluteExpiration = DateTime.MaxValue });

这样你的其他模块就不必引用 System.Web

HttpContext.Items 是一个 IDictionary,因此您可以通过依赖该抽象来避免 System.Web 对公共代码的依赖:

Utility.dll

class Util
{
    static void DoStuff(IDictionary environment) { ... }
}

App.dll

class App
{
    void DoStuff()
    {
        Util.DoStuff(new Hashtable { { "Foo", "Bar" } });
    }
}

Web.dll

class MyModule : IHttpModule
{
    void Init(HttpApplication context)
    {
        Util.DoStuff(context.Context.Items);
    }
}

感谢@user1429080。这是一种简单的 DI 模式。

添加接口到 Util.dll。
在 class 中添加对它的引用 Util 添加 属性 以访问它。

该界面在 Web 中实现Util.dll。 WebUtil 正在引用 System.Web。

在 HttpModule.Init() 中,我将实现分配给接口。

Util class 正在使用接口读取从 HttpModule 生成的数据,而不是访问 System.Web。

现在我可以通过为接口创建另一个实现来获得另一个数据源。