Réutiliser l'architecture MVC; Avoir deux couches d'interface utilisateur: ASP.NET MVC et .NET Winforms

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

Question

Bien que ma question puisse paraître abstraite, j'espère que non. Supposons que je développe une application, un site ASP.NET MVC, puis que je sois chargé de créer un client Winforms pour cette application. Comment puis-je le réutiliser à partir de l'application existante?

J'ai défini les modèles, j'ai défini les contrôleurs et les vues. Ils fonctionnent tous bien.

Le patron vient maintenant demander un client Winforms et j’espère pouvoir réutiliser les modèles et les contrôleurs (à condition que je les mette dans des assemblys différents) et non seulement les vues (vues ASPX).

Cela peut-il être fait? Comment?

Était-ce utile?

La solution

Je l’ai déjà fait auparavant, pas avec asp.net MVC mais avec des formulaires Web purement asp.net. J'ai utilisé un modèle MVP (Model-View-Presenter) développé localement et la chose la plus importante pour permettre à Presenter (== Controller dans votre cas) d'être utilisée dans une application WinForms était de ne faire référence à rien à faire avec system.web

La première chose à faire est donc de présenter une ou plusieurs interfaces pour envelopper toutes les requêtes, réponses, contenus Web, etc., et de faire en sorte que chaque présentateur accepte ces interfaces via l'injection de dépendance (ou les mette à la disposition des présentateurs par une autre technique). ), alors si le présentateur utilise ceux-ci plutôt que les éléments réels de system.web.

Exemple:

Imaginez que vous souhaitiez transférer le contrôle de la page A à la page B (dans votre application Winforms, vous souhaiterez peut-être fermer le formulaire A puis ouvrir le formulaire B).

Interface:

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

implémentation Web:

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

implémentation de winforms:

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

Maintenant le présentateur (contrôleur dans votre cas):

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");
  }
}

Je n'ai pas examiné en détail la mise en œuvre de l'ASP.net MVC, mais j'espère que cela vous donne une indication du fait que le scénario que vous recherchez nécessitera probablement beaucoup de travail.

Au lieu de cela, vous voudrez peut-être envisager d'accepter le recodage de la vue et du contrôleur pour les différentes plates-formes, et de vous concentrer sur la réduction de la taille de vos contrôleurs et l'insertion de la majeure partie de votre code dans une couche de service partagé.

Bonne chance!

Autres conseils

Consultez le kit de démarrage Northwind (ne vous laissez pas rebuter par le bit Northwind ): différentes interfaces graphiques sont associées à une architecture en couches, y compris MVC et Winforms.

Il fait exactement ce que vous voulez atteindre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top