MVC – solución base Vs Control de fuente ramificada

Estoy planeando una aplicación MVC de la que habrá dos variantes; uno para los Estados Unidos y otro para Europa. No puedo prever que una tercera (o enésima) implementación ocurra.

Las dos aplicaciones compartirán funcionalidad casi idéntica pero con algunas (razonablemente) pequeñas variaciones en el Modelo, Vista y Controlador.

Utilizaremos Entity Framework con un enfoque basado en la database.

Las dos opciones que veo son:

  1. Utilice una solución MVC básica, junto con una solución para las características específicas de cada implementación: Modelos base ampliados, Controladores de events de controller, algunas vistas parciales cuidadosamente consideradas y CSS y JS integrados.

  2. Utilice una única solución para todo el proyecto, pero use dos twigs de control de versiones (SVN) para las implementaciones por separado

¿Cuál de estos es el enfoque "apropiado" para este tipo de proyecto? ¿O hay una tercera opción?

ACTUALIZACIÓN : Una solución alternativa que se me ha señalado, sería hacer que esta única aplicación alojada en Azure / AWS, y con alguna lógica condicional dependiendo de si la request se realiza desde el encabezado de host de EE. UU. O de la UE.

La opción 2 dificultará la aplicación de la mejora. Debes aplicarlo en 2 lugares. Será peor si cualquiera de las twigs es incompatible por lo que se necesita algún ajuste / modificación. Será útil si las diferencias entre el medio ambiente son grandes.

La opción 1 es mejor. Tenga en count que necesitará un buen plan para diseñar código CSS / javascript parcial. Sin embargo, con este layout se encontrará con duplicación de código (que también ocurre en la opción 2). Considera este código:

public void DoSomething(){ // retrieve data // specific code for EU / NA // save data } 

Esto puede conducir a una duplicación en la retrieve data y el save data .

Hay un truco para manejar esto, pero creo que la forma más limpia es usar Dependency Injection . Con DI y un DI Container decente (no tengo experiencia en configurar DI Container, así que no puedo darle una sugerencia sobre cuál es bueno), obtendrá los siguientes beneficios:

  • Puede manejar código duplicado como el ejemplo anterior
  • Puede definir algunos perfiles para facilitar la configuration y el cableado, facilitando el mantenimiento
  • Testable