Вопросы архитектуры программы - PullRequest
1 голос
/ 29 июля 2011

У меня есть пара вопросов об архитектуре / дизайне программы.
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.

  1. Мой второй вопрос: мне просто не хватает знаний об архитектуре / дизайне программы. Кто-нибудь из вас знает, какую книгу / статью / ссылку рекомендуется прочитать? Спасибо

P.S. Кто-нибудь из вас также не видит стрелки и ссылку StackExchange в браузере Google Chrome?

Ответы [ 3 ]

1 голос
/ 29 июля 2011

Здесь я вижу два фундаментальных решения.

Во-первых, существуют ли режимы отказа Box, которые должны требовать перезапуска всего процесса, в котором выполняются процессы?

Затем, если есть такиеРежимы отказов. Можем ли мы ограничить влияние режимов отказов, разделив боксы на их собственные пространства процессов?То есть мы увеличим изоляцию, чтобы улучшить общую стабильность?

Принцип изоляции очень часто применяется, например, на серверах приложений Java EE мы можем сознательно выбрать изоляцию некоторых приложений от других, потому что некоторые приложения являютсянестабильный - нестабильный код JNI имеет тенденцию разрушать весь процесс.

Я полагаю, что такого рода изоляция обычно необходима, потому что у нас есть основания не доверять некоторому коду.Теперь в вашем случае вы пишете Box, действительно ли невозможно перехватить все исключения и обработать их?Даже если Box должен остановиться, не можем ли мы уловить проблему и запустить новый экземпляр?

Так что я бы попытался укрепить свой класс Box, чтобы изоляция не требовалась.

1 голос
/ 29 июля 2011

Вы не можете использовать один try/catch в foreach, потому что при вызове box.Run() вы запускаете потоки внутри класса Box, однако вы должны предсказать исключения внутри класса Box и обработать их там., но если вы не можете сделать это «возможно, потому что вы вызываете другую стороннюю библиотеку, которая сама запускает некоторые потоки, что может вызвать исключения», тогда вы можете создать и запустить каждый блок вдругой домен приложения? здесь пример того, как это сделать, тем самым вы можете обрабатывать каждое исключение блока отдельно, обрабатывая каждое из исключений домена приложения блоков:

myBoxDomain.UnhandledException += OnCurrentDomain_UnhandledException;

Таким образом, вы можете обрабатывать каждый блоксбой здесь, не затрагивая другие коробки.

1 голос
/ 29 июля 2011

Почему бы вам не обработать какие-либо исключения?

public void Run()
{
    foreach(var box in _boxes)
    {
       try { box.Run(); }
       catch(Exception ex){ /* handle exception */ }
    }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...