Повторное использование архитектуры MVC;Есть два уровня пользовательского интерфейса :ASP.NET MVC и .NET Winforms
-
02-07-2019 - |
Вопрос
Хотя мой вопрос может показаться абстрактным, я надеюсь, что это не так.Предположим, я разрабатываю приложение, сайт 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.
Это делает именно то, чего вы хотите достичь.