Проброс событий C#

335
01 мая 2017, 00:01

Есть некоторый класс Controller, который является входной точкой в приложение и реализует интерфейс IController с набором методов, доступных извне клиентам. Внутри Controller состоит из множества компонентов(классов), таких как: Farmmanager, RequestsManager, MatrixnnManager и многих других, которые выполняют разные задачи. Все это хозяйство располагается в UnityContainer. При запуске приложения Controller создает контейнер и устанавливается взаимодействие между компонентами(FarmManager и др) посредством установления связи между обработчиками одних компонентов и событиями других. Каждый из компонентов внутри имеет подкомпоненты и далее, иерархия может быть глубокой. Архитектурно получается так, что клиент вызывает какой-то метод Controller, а тот в свою очередь вызывает событие, которое уходит компоненту, тот пробрасывает подкомпоненту и далее.. Получается по 5-6 уровней, через которое пробрасывается событие. Архитектурно компоненты никак друг с другом не связаны, кроме как через события и обработчики, но это порождает необходимость сквозных пробросов. Подскажите пожалуйста, как можно преобразовать архитектуру так, чтобы несвязность компонентов сохранилась ,однако исчезла бы необходимость реализовывать одно и то же событие во всей иерархии компонента (подкомпонент, подподкомпонент).

Примерно это все выглядит следующим образом: (не стоит искать ошибок в коде, это накиданный пример)

 public Class Controller : IController
    {
     public override event Eventhandler NewMessage; 
      public override void AddMessage(T message)
     {
        OnNewMessage();
     }
      public override NodeState GetStateOfNode(int index)
     {
     }
     private void Start()
     {
       var container = new UnityContainer();
    container.RegisterType<IFarmManager, FarmManager>(newContainerControlledLifetimeManager());
    container.RegisterType<IRequestsManager, RequestsManager>(newContainerControlledLifetimeManager());
       NewMessage+= RequestsManager.onNewMessage
     }
    }
  public class RequestsManager: IRequestsManager
  {   
     public override event Eventhandler NewMessage; 
     private QueueProcessDispatcher = new QueueProcessDispatcher();
     public void onNewMessage()
    {
      OnNewMessage();
    }
     public void Start()
    {
      NewMessage+=QueueProcessDispatcher.NewMessage;
    }
  }
READ ALSO
Реакция на данные в БД.

Реакция на данные в БД.

Привет всем, у меня недавно возникла ситуацияЗаключается она в том что нужно оправлять письма пользователям, например за 5 дней до их дня...

208
Добавляет ли метод First или Last в классе List в сам список?

Добавляет ли метод First или Last в классе List в сам список?

EnumerableFirst - берет первый first элемент из коллекции, если коллекция пуста - падает эксепшн

255
Подключить к ASP Core проекту фреймворк SignalR

Подключить к ASP Core проекту фреймворк SignalR

Как подключить к ASP Core проекту SignalR?

230
Передача файла в ASP.NET

Передача файла в ASP.NET

Как в ASPNET передать файл POST запросом? (класс, метод)

297