Riutilizzare l'architettura MVC; Hanno due livelli di interfaccia utente: ASP.NET MVC e .NET Winforms

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

Domanda

Anche se la mia domanda potrebbe sembrare astratta, spero che non lo sia. Supponiamo che io sviluppi un'applicazione, un sito ASP.NET MVC e in seguito mi venga assegnato il compito di creare un client Winforms per questa applicazione quanto e come posso riutilizzare dall'applicazione esistente?

Ho definito i modelli, ho definito controller e viste. Funzionano tutti bene.

Ora il capo viene a chiedere un client Winforms e spero di poter riutilizzare i modelli e i controller (purché li inserisca in assiemi diversi) e non riutilizzare solo le viste (viste ASPX).

Questo può essere fatto? Come?

È stato utile?

Soluzione

L'ho già fatto in precedenza, non con asp.net MVC ma con moduli web puri asp.net. Ho usato un modello MVP (Model-View-Presenter) cresciuto in casa e la cosa più importante in assoluto per consentire al Presenter (== controller nel tuo caso) di essere utilizzato in un'app WinForms era di non fare riferimento a nulla da fare con system.web

Quindi la prima cosa che devi fare è introdurre le interfacce per avvolgere qualsiasi richiesta, risposta, roba web ecc. e far accettare a tutti i Presenter queste interfacce tramite Dependency Injection (o renderle disponibili ai Presenter con un'altra tecnica ), quindi se il Presentatore utilizza tali elementi anziché quelli reali di system.web.

Esempio:

Immagina di voler trasferire il controllo dalla Pagina A alla Pagina B (che nella tua app Winforms potresti voler chiudere il modulo A e quindi aprire il modulo B).

Interfaccia:

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

implementazione web:

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

implementazione winforms:

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

Ora il presentatore (controller nel tuo caso):

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

Non ho esaminato in dettaglio l'implementazione di asp.net MVC, ma spero che ciò vi dia qualche indicazione che probabilmente sarà molto lavoro per abilitare lo scenario che state cercando.

Potresti invece considerare di accettare che dovrai ricodificare la vista e il controller per le diverse piattaforme e concentrarti invece sul mantenere i tuoi controller estremamente sottili e mettere la maggior parte del tuo codice in un livello di servizio che può essere condivisa.

Buona fortuna!

Altri suggerimenti

Dai un'occhiata al Starter kit Northwind (non lasciarti scoraggiare dal bit Northwind ) - che ha diverse GUI collegate a un'architettura a più livelli, inclusi MVC e Winforms.

Fa esattamente quello che vuoi ottenere.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top