Повторно использовать архитектуру MVC; Имеют два уровня пользовательского интерфейса: ASP.NET MVC и .NET Winforms - PullRequest
8 голосов
/ 24 сентября 2008

Хотя мой вопрос может показаться абстрактным, я надеюсь, что это не так. Предположим, я разрабатываю приложение, сайт ASP.NET MVC, а затем мне поручено создать клиент Winforms для этого приложения, сколько и как я могу использовать из существующего приложения?

Я определил модели, я определил контроллеры и представления. Все они работают хорошо.

Теперь приходит босс с просьбой о клиенте Winforms, и я надеюсь, что смогу повторно использовать модели и контроллеры (при условии, что я помещаю их в разные сборки), а не использовать только виды (представления ASPX).

Можно ли это сделать? Как?

Ответы [ 2 ]

10 голосов
/ 24 сентября 2008

Я делал это ранее, не с asp.net MVC, а с чистыми веб-формами asp.net. Я использовал самодельный шаблон MVP (Model-View-Presenter), и самое важное, что позволило использовать Presenter (== Controller в вашем случае) в приложении WinForms, было не ссылаться на что-либо делать с system.web

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

Пример:

Представьте, что вы хотите передать управление со страницы A на страницу B (на которой в вашем приложении winforms вы можете закрыть форму A, а затем открыть форму B).

Интерфейс:

public interface IRuntimeContext
{
  void TransferTo(string destination);
}

веб-реализация:

public class AspNetRuntimeContext
{
  public void TransferTo(string destination)
  {
    Response.Redirect(destination);
  }
}

Реализация winforms:

public class WinformsRuntimeContext
{
  public void TransferTo(string destination)
  {
    var r = GetFormByName(destination);
    r.Show();
  }
}

Теперь ведущий (контроллер в вашем случае):

public class SomePresenter
{
  private readonly runtimeContext;
  public SomePresenter(IRuntimeContext runtimeContext)
  {
    this.runtimeContext = runtimeContext;
  }

  public void SomeAction()
  {
    // do some work

    // then transfer control to another page/form
    runtimeContext.TransferTo("somewhereElse");
  }
}

Я не рассматривал реализацию MVC asp.net подробно, но я надеюсь, что это даст вам некоторое представление о том, что, вероятно, потребуется много работы для включения сценария, который вам нужен.

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

Удачи!

2 голосов
/ 15 июля 2009

Взгляните на стартовый комплект Northwind (не отчаивайтесь битом Northwind) - к нему подключены различные графические интерфейсы для многоуровневой архитектуры, включая MVC и Winforms.

Это именно то, что вы хотите достичь.

...