我正在构建一个宠物软件,其描述是:“网络上的外壳”。我会做一个shell来与API进行交流,主要是为了激活你经常在网上做的所有任务。
我需要帮助如何在.NET 4(C#)中设计这个软件。
我刚开始,软件在3个DLL中分开: UI - >连接器 - >命令[] 即可。 (不是3 DLL,因为每个命令都在一个单独的DLL中)
UI使用连接器项目执行另一个.dll中的命令,该项目具有命令项目实施的接口。使用反射(在 UI 中)我执行该接口的实现,因此所有命令都是独立的并且与主项目分开。
在连接器项目中,a有一个名为 Shell 的类型,它是将输出发送到 UI 的促进者。因此,当有人正在构建命令时,他将发送文本或其他内容,例如使用.Net框架的 System.Console 。
我真的想让这个SHELL类保持静态,但是该类具有状态,并且每个Request必须具有独立状态。因此,据我所知,静态类将具有应用程序池的生命周期。我没错?
答案 0 :(得分:1)
如果您认识到Shell必须具有状态,那么它不应该是静态的。无论它是控制台应用程序还是Web应用程序。有一件事是你可以在一个线程应用程序中安全地使用它,你知道没有人使用你的类,但一个非常不同的是,这是一个很好的设计。
如果您的类具有需要为许多函数和所有实例共享的某种配置,则可以为该数据声明静态属性或字段。但是,不同线程需要不同的数据必须是非静态的。
此外,在多线程环境中,如Web应用程序,您必须设计您的类以使其线程安全,否则您将遇到麻烦。如果你的课程有静态方法,而不是静态数据,那么你不必担心线程安全。
只要"预期寿命"对于Web应用程序中的静态类,它将在许多请求中存活,但请记住,Web服务器的主线程将不时自动重新启动(取决于IIS配置),这样您就无法信任静态成员保持数据"永远"。您应该在Application Start事件上设置静态数据,并将更改的数据存储在permamnet存储(通常是数据库)中,以确保在应用程序重新启动后可以恢复它。
所以你最好改变你的班级设计。这不应该假设您的控制台应用程序中做了很多更改(除了使用更多的新内容之外)。
答案 1 :(得分:1)
您是否考虑过使用Inversion of Control (IoC)框架。大多数框架都有一个生活方式示例的概念,其中可能是暂时的,在超出范围后被删除,或者只有一个实例被创建的单例。
如果应用程序池被回收或重新启动,您仍需要保留应保留的所有数据。
静态类也使单元测试变得更加困难。
注意IoC: