Pergunta

Embora a minha pergunta pode parecer esperança abstrata eu não é. Suponha que eu desenvolver um aplicativo, um site ASP.NET MVC e mais tarde eu estou encarregado de construir um cliente WinForms para esta aplicação o quanto e como posso reutilizar da aplicação existente?

I definiu os modelos, eu definido controladores e pontos de vista. Todos eles trabalham bem.

Agora, o chefe vem pedindo um cliente WinForms e estou esperando que eu possa reutilizar os modelos e os controladores (desde que eu colocá-los em diferentes assembleias) e não reutilizar apenas os pontos de vista (vista ASPX).

Isso pode ser feito? Como?

Foi útil?

Solução

Eu tenho feito isso antes, não com asp.net MVC, mas com formas asp.net web puros. Eu usei um MVP padrão home-grown (Model-View-Presenter), e a maioria absoluta importante para permitir que o Presenter (== Controlador no seu caso) para ser usado em um aplicativo WinForms foi a não referência nada a ver com system.web

Assim, a primeira coisa que você precisa fazer é introduzir Interface (s) para embrulhar qualquer pedido, resposta, coisas web etc, e tem todo o Presenter aceitar estas interfaces através de Dependency Injection (ou torná-los disponíveis para os apresentadores por alguma outra técnica ), então se o apresentador usa aqueles em vez do material system.web real.

Exemplo:

Imagine que você quer controle de transferência da página A para a página B (que em seus winforms app você pode querer forma estreita A então forma aberta B).

Interface:

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

aplicação web:

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

winforms implementação:

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

Agora, o Apresentador (Controller no seu 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");
  }
}

Eu não olhei para o asp.net MVC implementação em detalhes, mas espero que isso lhe dá alguma indicação de que ele provavelmente será um monte de trabalho para permitir o cenário que você está depois.

Você vez pode querer considerar aceitar que você terá que re-código do View e Controller para as diferentes plataformas, e em vez disso se concentrar em manter seus controladores extremamente fina e colocar a maior parte de seu código em uma camada de serviço que pode ser compartilhado.

Boa sorte!

Outras dicas

Tenha um olhar para o Adamastor Starter Kit (não ser adiadas pelo pouco Adamastor .) - que tem várias GUIs ligados a uma arquitetura em camadas, incluindo tanto MVC e WinForms

Ele faz exatamente o que você deseja alcançar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top