有没有办法在HTTP模块中创建对象并将这些对象传递给应用程序。
我可以使用HTTPContext.Items。但这意味着我将在将使用这些数据的应用程序中的任何DLL中引用System.Web。 Utility.dll正在读取http模块生成的数据,我不想在该DLL中引用System.Web,因为它被Web和桌面应用程序使用。 当然桌面应用程序找不到对象,这不是问题。
答案 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.Items
是IDictionary
,因此您可以通过依赖抽象来避免公共代码中的System.Web依赖:
class Util
{
static void DoStuff(IDictionary environment) { ... }
}
class App
{
void DoStuff()
{
Util.DoStuff(new Hashtable { { "Foo", "Bar" } });
}
}
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。
现在,我可以通过为接口创建另一个实现来获得另一个数据源。