Web上下文中Static类的生命周期

时间:2012-03-21 21:22:56

标签: .net architecture

我正在构建一个宠物软件,其描述是:“网络上的外壳”。我会做一个shell来与API进行交流,主要是为了激活你经常在网上做的所有任务。

我需要帮助如何在.NET 4(C#)中设计这个软件。

我刚开始,软件在3个DLL中分开: UI - >连接器 - >命令[] 即可。 (不是3 DLL,因为每个命令都在一个单独的DLL中)

UI使用连接器项目执行另一个.dll中的命令,该项目具有命令项目实施的接口。使用反射(在 UI 中)我执行该接口的实现,因此所有命令都是独立的并且与主项目分开。

连接器项目中,a有一个名为 Shell 的类型,它是将输出发送到 UI 的促进者。因此,当有人正在构建命令时,他将发送文本或其他内容,例如使用.Net框架的 System.Console

我真的想让这个SHELL类保持静态,但是该类具有状态,并且每个Request必须具有独立状态。因此,据我所知,静态类将具有应用程序池的生命周期。我没错?

2 个答案:

答案 0 :(得分:1)

如果您认识到Shell必须具有状态,那么它不应该是静态的。无论它是控制台应用程序还是Web应用程序。有一件事是你可以在一个线程应用程序中安全地使用它,你知道没有人使用你的类,但一个非常不同的是,这是一个很好的设计。

如果您的类具有需要为许多函数和所有实例共享的某种配置,则可以为该数据声明静态属性或字段。但是,不同线程需要不同的数据必须是非静态的。

此外,在多线程环境中,如Web应用程序,您必须设计您的类以使其线程安全,否则您将遇到麻烦。如果你的课程有静态方法,而不是静态数据,那么你不必担心线程安全。

只要"预期寿命"对于Web应用程序中的静态类,它将在许多请求中存活,但请记住,Web服务器的主线程将不时自动重新启动(取决于IIS配置),这样您就无法信任静态成员保持数据"永远"。您应该在Application Start事件上设置静态数据,并将更改的数据存储在permamnet存储(通常是数据库)中,以确保在应用程序重新启动后可以恢复它。

所以你最好改变你的班级设计。这不应该假设您的控制台应用程序中做了很多更改(除了使用更多的新内容之外)。

答案 1 :(得分:1)

您是否考虑过使用Inversion of Control (IoC)框架。大多数框架都有一个生活方式示例的概念,其中可能是暂时的,在超出范围后被删除,或者只有一个实例被创建的单例。

如果应用程序池被回收或重新启动,您仍需要保留应保留的所有数据。

静态类也使单元测试变得更加困难。

注意IoC: