Как мне спроектировать View logic в проекты c # - PullRequest
5 голосов
/ 12 января 2010

В моем решении три проекта на c #. Одним из них является консольное приложение, которое просто вызывает проект библиотеки классов. Проект библиотеки классов выполняет всю обработку для приложения. Затем существует проект WinForm, который отображает форму, а затем при нажатии кнопки вызывает ту же логику в проекте библиотеки классов. В результате есть два способа запустить логику: через консоль или через пользовательский интерфейс Windows (WinForm).

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

В консольном приложении я хочу, чтобы то же место в логике просто записывалось в консоль. В моем понимании архитектуры вы не хотите, чтобы проект библиотеки классов содержал логику WinForm и требовал, чтобы он имел ссылки на все ссылки WinForm. Но как мне сделать вызов проекта WinForms (или чего-то еще) для отображения пользовательской формы WinForm? Будет циклическая ссылка, в которой библиотека классов будет ссылаться на основное приложение WinForm, а приложение WinForm будет ссылаться на проект библиотеки классов.

Какой стандартный способ сделать это?

Ответы [ 7 ]

2 голосов
/ 12 января 2010

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

Вызывающий обрабатывает методы соответственно ...

public interface IProgressReporter
{
       void ReportMessage(string message);
}



public class WinFormsProgressReporter : IProgressReporter
{
    public void ReportMessage(string message)
    {
          MessageBox.SHow(message);
    }
}

public class ConsoleAppProgressReporter : IProgressReporter
{
    public void ReportMessage(string message)
    {
          Console.WriteLine(message);
    }
}

public class LibraryClass
{
    public static void SomeMethod(IProgressReporter rep)
    {
         rep.ReportMessage("Wooooohooooo!");
    }
}
2 голосов
/ 12 января 2010

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

2 голосов
/ 12 января 2010

Почему бы не определить интерфейс, IOutputHandler, у которого есть метод с именем DisplayOutput. У вас будет две реализации, одна для вашего приложения winforms и одна для консоли. Вы бы назвали правильную версию во время выполнения. Вы можете изменить библиотеку классов, чтобы иметь экземпляр закрытого поля для IOutputHandler, а затем подключить нужный во время выполнения.

0 голосов
/ 12 января 2010

Другое решение

В вашем классе библиотека ..

public void MyLibMethod(Action<string> callBack)
{
      callBack("Yeh baby...");
}

Тогда звоните

Class.MyLibMethod(s=> Console.WriteLine(s));
0 голосов
/ 12 января 2010

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

0 голосов
/ 12 января 2010

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

0 голосов
/ 12 января 2010

Здесь вам нужно четкое определение между вашим уровнем логики и уровнем пользовательского интерфейса. Вполне приемлемо и нормально помещать такую ​​логику в ваш пользовательский интерфейс, поскольку этот бит не может разумно существовать на уровне логики, так как он зависит от пользовательского интерфейса.

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