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

时间:2015-01-11 11:58:32

标签: asp.net .net httpmodule

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

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

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

Utility.dll模块可以有一个接受

等数据的方法

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

如果您真的希望您的Utility.dll模块从Web服务器提取数据,那么您可以使用内置缓存,如@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

答案 2 :(得分:0)

HttpContext.ItemsIDictionary,因此您可以通过依赖抽象来避免公共代码中的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);
    }
}

答案 3 :(得分:0)

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

为Util.dll添加界面 在类Util中添加对它的引用添加一个属性来访问它。

该接口在WebUtil.dll中实现。 WebUtil引用System.Web。

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

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

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