【问题标题】:Program architecture questions程序架构问题
【发布时间】:2011-07-29 15:29:05
【问题描述】:

我有几个关于程序架构/设计的问题。
1.我正在完全重构我的一个程序,该程序的目的是将文件从客户端传输到服务器端(如drop box或cyber ark)。它可以根据配置创建客户端数量,都在窗口服务下。 让我们看看开始代码:

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

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

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

每个 Box 类都是“活的”,但如果其中一个因非托管异常而失败,则整个服务将丢失,或者通过更好地管理资源。我的想法是,窗口服务是主类,它将以不同的Process 或使用appDomain 类启动 Boxes 的数量。

  1. 我的第二个问题是——我只是缺乏程序架构/设计方面的知识,你们中有人知道推荐的书/文章/链接吗? 谢谢

附: 你们中的任何人是否也看不到 Google chrome 浏览器中的箭头和 StackExchange 链接?

【问题讨论】:

  • 关于网站的问题,请到meta.stackoverflow.com
  • 请发表您的 P.S.在元。它不属于这个问题。
  • '重构'?现在有一个弗洛伊德式的失误,如果我听说过的话:)
  • box.Run() 时,您是否在 Box 类中运行任何线程?
  • 'refuctoring' - 对此感到抱歉 :) Box 是一个不同的线程,用于监视创建文件的文件夹

标签: c# architecture windows-services


【解决方案1】:

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

myBoxDomain.UnhandledException += OnCurrentDomain_UnhandledException;

因此,您可以在这里处理每个盒子的故障,而不会影响其他盒子。

【讨论】:

    【解决方案2】:

    你为什么不处理任何异常?

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      我的看法是,通常需要这种隔离,因为我们有理由不信任某些代码。现在在您的情况下,您正在编写 Box,是否真的不可能捕获所有异常并处理它们?即使 Box 需要停止,我们难道不能发现问题并启动一个新实例吗?

      所以我会尝试强化我的 Box 类,以便不需要隔离。

      【讨论】:

      • 这里为什么不推荐隔离?每个盒子都在监控不同的文件夹有不同的队列和线程。
      • 因为它(在我对您的情况的了解有限的情况下)似乎是容纳错误代码的让步。您拥有的流程越多,您使用的资源就越多,您的解决方案也就越复杂。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-18
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      • 2021-05-27
      • 2012-06-14
      相关资源
      最近更新 更多