Поднять пользовательское событие в мульти-проекте - PullRequest
2 голосов
/ 29 июля 2010

это касается следующего: у меня есть два проекта, которые должны существовать более или менее независимо друг от друга.Первый проект - это своего рода наблюдатель за файловой системой.Еще один коснист моего интерфейса.Средство просмотра файлов вызывает событие, если существует новый файл.После этого данные из файла должны быть добавлены в базу данных.Это грубо справочная история.Фактическая проблема заключается в том, что после того, как средство просмотра файлов вызвало событие, я хочу уведомить пользовательский интерфейс об обновлении представления данных.Это означает, что событие должно быть вызвано наблюдателем файла, и событие должно быть зарегистрировано в реализации пользовательского интерфейса.Основная проблема сейчас в том, что мне нужны экземпляры классов из обоих проектов.Очевидно, что это приводит к проблеме циклической зависимости.Конечно, есть решение интерфейсов для проблемы CP, но это не решит проблему, так как мне нужен один и тот же объект для создания данных и регистрации событий.Надеюсь, вы можете помочь мне с этой проблемой.Спасибо.

Ответы [ 2 ]

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

Почему, по вашему мнению, вам нужен экземпляр пользовательского интерфейса в сборке бизнес-логики?

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

Тогда у вас есть, например, следующая структура:

Сборка с логикой

public class MyCustomWatcher
{   
    public event EventHandler Event;

    private void RaiseEventForWhateverReason()
    {
        if (Event != null)
        {
            Event(this, new Args());
        }
    }
   public Data GetData()
   {
    //return the data
   }
}

Сборка с пользовательским интерфейсом: - здесь объявлены как типы, так и типы контроллеров.

class Form : System.Windows.Forms.Form
{
 public void DisplayNotification(Data data)
 {
   //actual code here
 }
}

class Controller 
{
    private Form form;
    private MyCustomWatcher watcher;

    public void Init()
    {
      this.watcher = CreateWatcher();
      RegisterEvents();
      ShowForm();
    }
    void ShowForm()
    {
     //show
    }
    void RegisterEvents()
    {
        this.watcher.Event += HandleChange;
    }

    void HandleChange(object sender /*this will be the instance that raised the event*/, SomeEventArgs e)
    {
        //BTW: this.watcher == sender; //the same instance

        form.DisplayNotification(this.watcher.GetData());
    }
}

Сборка с пользовательским интерфейсом ссылается на сборку с логикой.Здесь нет круговой зависимости.

0 голосов
/ 29 июля 2010

Я не уверен, что понимаю, почему FileWatcher будет зависеть от вашего пользовательского интерфейса, но так как вы говорите, что он может добавить третий проект для работы в качестве агрегатора событий между двумя. Это даст обоим проектам зависимость от агрегатора, но удалит зависимости друг от друга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...