Повторное использование архитектуры MVC;Есть два уровня пользовательского интерфейса :ASP.NET MVC и .NET Winforms

StackOverflow https://stackoverflow.com/questions/124358

Вопрос

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

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

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

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

Это было полезно?

Решение

Я делал это ранее, но не с помощью asp.net MVC, а с помощью чистых asp.net веб-форм.Я использовал доморощенный шаблон MVP (Model-View-Presenter), и абсолютная самая важная вещь, позволяющая использовать Presenter (== Controller в вашем случае) в приложении WinForms, заключалась в том, чтобы не ссылаться на что угодно что делать с 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");
  }
}

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

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

Удачи вам!

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top