взаимодействие между проектами - PullRequest
5 голосов
/ 09 августа 2011

У меня есть два проекта.ProjectA имеет класс с именем Task, а projectB имеет класс с именем Transmission.Мне бы хотелось, чтобы при изменении Передачи - что-то происходило в Задаче, а при каждом изменении Задачи - что-то происходило в Передаче.

Для этого я создал еще один проект под названием Common, на который будут ссылаться как ProjectA, так и projectB.В общем я поставил все интерфейсы для взаимодействия между обеими сущностями.

В проекте Common я создал интерфейс IManager, который будет реализован в ProjectA.Роль менеджера заключается в обработке обновлений.Интерфейс выглядит следующим образом:

public interface IManager
{
    ITaskChangedHandler TaskChangedHandler { set; }

    void OnTransmissionChanged(ITransmissionWithTasks transmission);
}

Этот интерфейс имеет 2 метода, которые ProjectA должен реализовать:

  1. void OnTransmissionChanged(ITransmissionWithTasks transmission); При изменении передачи (внутри ProjectB) этот метод вызывается для обновления задач.

  2. ITaskChangedHandler TaskChangedHandler { set; } В реализации IManager должен быть установлен параметр ITaskChangedHandler.ITaskChangedHandler - это интерфейс, который определяет способ передачи обновлений в случае изменения задачи:

    public interface ITaskChangedHandler   
    {   
        void OnTaskChanged(string moduleName, ITask task, long transmissionId);   
    }   
    

Теперь это выглядит так:

  1. ProjectA имеет реализацию для IManager.

  2. Всякий раз, когда в передаче происходит изменение, я использую StructureMap для получения экземпляра реализации IManager, а затем вызываю OnTransmissionChanged();

  3. Это моя проблема- Всякий раз, когда происходит изменение в Задаче (в ProjectA), я хотел бы назвать реализацию IManager TaskChangedHandler.OnTaskChanged().Но проблема в том, что экземпляр реализации IManager не устанавливает TaskChangedHandler.
    Я также не знаю, где я должен установить этот TaskChangedHandler:

    • Это не может бытьв ProjectA, потому что он не знает реализацию ITaskChangedHandler.

    • Этого не может быть в ProjectB, потому что создание реализации IManager происходит в ProjectA, поэтому набор должен быть в ProjectA.

    • Этого не может быть в общем проекте, поскольку он не знает реализации IManager и ITaskChangedHandler.

Может кто-нибудь помочь мне решить эту проблему?

1 Ответ

2 голосов
/ 09 августа 2011

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

public static class SharedEvents
{
    public delegate void FirstEventHandler();
    public delegate void SecondEventHandler();

    public static event FirstEventHandler FirstEvent;
    public static event FirstEventHandler SecondEvent;

    public static void OnFirstEvent()
    {
        if (FirstEvent != null) FirstEvent();
    }

    public static void OnSecondEvent()
    {
        if (!SecondEvent != null) SecondEvent();
    }
}

Один регистр для обработки FirstEvent, другой для обработки SecondEvent: для вызова друг друга, соответственно, OnFirstEvent() или OnSecondEvent().

Это простая и довольно скудная реализация шаблона Mediator:

http://en.wikipedia.org/wiki/Mediator_pattern

С помощью внедрения зависимостей вы также можете получить экземпляр объекта на основе общего интерфейса. Например, в Ninject вы можете зарегистрировать обработчик для IFirst, который будет константой (конкретный экземпляр чего-то, что реализует IFirst), и наоборот. Затем позвоните Get<IFirst>, чтобы взять его.

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