程序架构问题

时间:2011-07-29 15:29:05

标签: c# architecture windows-services

我对程序架构/设计有几个问题 1.我完全重构了我的一个程序,该程序的目的是将文件从客户端传输到服务器端(如丢弃框或网络柜)。它可以根据配置创建多个客户端,全部在窗口服务下。 让我们看一下开始代码:

public class Master
{
  private List<Box> _boxes = new List<Box>();

  public Master()
  {
     Initialize(); ...
  }

  public void Run()
  {
     foreach(var box in _boxes)
     {
        box.Run();
      }
  }
  }

每个Box类都是&#34; Living&#34;由它自己,但如果其中一个失败与非托管异常然后整个服务丢失,或通过更好地管理资源。我的想法是窗口服务是主类,它将以不同的ProcessappDomain类开始Box的数量。

  1. 我的第二个问题是 - 我只是缺乏程序架构/设计的知识,你们中的任何人都知道推荐的书籍/文章/链接吗? 谢谢
  2. P.S。 你们中的任何人还看不到Google Chrome浏览器中的箭头和StackExchange链接吗?

3 个答案:

答案 0 :(得分:1)

为什么不处理任何例外?

public void Run()
{
    foreach(var box in _boxes)
    {
       try { box.Run(); }
       catch(Exception ex){ /* handle exception */ }
    }
 }

答案 1 :(得分:1)

我在这里看到两个基本决定。

首先,Box的故障模式是否需要重新启动运行的整个过程?

然后,如果存在这样的故障模式,我们可以通过将Box分成它们自己的过程空间来限制故障模式的影响吗?那我们应该增加隔离度以提高整体稳定性吗?

隔离原则非常普遍,例如在Java EE应用服务器中,我们可能会故意选择将某些应用程序与其他应用程序隔离,因为某些应用程序不稳定 - 不稳定的JNI代码往往会导致整个过程崩溃。

我认为通常需要这种隔离,因为我们有理由不相信某些代码。现在,在你的情况下,你正在编写Box,是否真的无法捕获所有异常并处理它们?即使Box需要停止也不能解决问题并启动新实例吗?

所以我试图强化我的Box类,这样就不需要隔离了。

答案 2 :(得分:1)

您不能在try/catch中使用单foreach因为您在调用Box时正在box.Run()类中运行线程,但是您应该预测其中的异常Box类并在那里处理它们,但是如果你无法这样做“可能是因为你调用另一个自己运行某些线程的第三方库,这可能会导致异常”,那么它是您可以选择在不同的应用程序域中创建和运行每个框吗? here如何做到这一点,通过这样做,您可以通过处理每个框的应用程序域异常来单独处理每个框异常:

myBoxDomain.UnhandledException += OnCurrentDomain_UnhandledException;

所以你可以在这里处理每个盒子的失败而不影响其他盒子。