La Estructura Definitiva de Soluciones de Visual Studio


Al darme cuenta de que esto podría ser subjetivo en función del proyecto en cuestión, estoy buscando el método de "mejor práctica" para estructurar una solución VS (Visual Studio).

Por favor, siéntase libre de editar esto, comentar lo que cree que podría ser incorrecto, sugerir alternativas, etc. Me encantaría ver que este Wiki de la Comunidad se convierta en un gran recurso para las personas que recién comienzan con VS Solutions.

A continuación se muestra lo que tengo trabajando para mí ahora (en mi proyecto actual), sin embargo, sé que es un hecho que hay algunas cosas en el lugar equivocado. En mi escenario, estoy construyendo una aplicación Web usando MVC 2

Por favor, publique su idea de la estructura de la solución definitiva para que podamos tener una idea de la" mejor manera " / "mejor práctica" (lo que eso signifique exactamente)

IE:
¿Cómo descompone su DAL (Data-Access-Layer) / BLL (Business-Logic-Layer)?
¿Pones la capa de repositorio y la capa de servicio dentro de tu BLL? Si eres usando MVC (Model-View-Controller), ¿mantiene sus controladores en la interfaz de usuario en lugar del Núcleo?
¿Tiras muchas cosas en tus carpetas de Utilidades / Misceláneas, o las rompes aún más?
sucesivamente...


  • MySolution
    • MySolution.Básica
      • Autenticación
        • aquí es donde tengo un POCO y un método para searializar el poco en la sección userData del auth cookie
      • Base
        • aquí es donde guardo mi BaseController y por BaseGlobal
      • Controladores
        • todos mis controladores (obviamente)
      • Dominio
        • Modelos de bases de datos
          • contiene mis L2S .archivo dbml
        • JsonModels
          • modelos utilizados para pasar objetos JSON al veiw
        • Repositorios
        • Servicios
        • ViewModels
      • Extensiones
        • todos los métodos de extensión
      • Filtros
        • Filtros de acción
      • Utilidades
        • Apis
          • todo el código API de terceros entra aquí
        • Insignias
          • el cálculo de la insignia va aquí
        • MailClient
          • enviar texto plano o correo electrónico html usando las clases aquí
        • Ayudantes de la ruta
          • contiene una clase para habilitar rutas en minúsculas
        • también contiene cosas que no se donde poner... IE: HTMLSanitizer, HtmlHelpers personalizados, userInfo helper (dirección IP, navegador, etc), DataConverter, etc
    • MySolution.UI
      • App_Browsers
      • Activos
        • Css
        • Imágenes
        • Scripts
      • Vistas
      • Global.asax - hereda de BaseGlobal
      • Web.config

Capturas De Pantalla
NúcleoUI

Por favor, no dude en comentar en consecuencia, o mejor aún, publicar su propia versión (respuesta) a continuación. Sé que lo que tengo no es la mejor manera.

Author: Chase Florell, 2010-08-19

3 answers

La estructura de su solución/proyecto me parece bastante sólida. Si nunca has echado un vistazo a S#arp Architecture, es posible que quieras hacerlo. La principal diferencia entre su estructura y la arquitectura de S#arp es que S#arp divide los Controladores, Servicios y Repositorios en proyectos separados. El principal beneficio de hacer esto es que se vuelve más fácil imponer límites en sus dependencias (por ejemplo, no accederá accidentalmente a los datos, acceda a bibliotecas específicas desde el código en Núcleo).

Aparte de eso, su estructura se ve muy similar a la que suelo usar para mis proyectos. También agrego una carpeta" Extensions " para los métodos de extensión, ya que a veces es difícil encontrar un buen lugar para ellos.

 7
Author: Kevin Pang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-15 16:41:04

Buen Wiki.

Estoy comenzando un nuevo proyecto, y esta es la estructura con la que he comenzado.

Sigue las Mejores Prácticas de Microsoft (Negocios, Datos, Servicios, Presentación).

texto alt

En mi solución:

  • Negocio: lógica específica del dominio / proyecto, y más notablemente de POCO.
  • Datos: repositorios. se explica por sí mismo.
  • Servicios: lógica sobre repositorios. puedo agregar almacenamiento en caché aquí, filtrado, etc. Mi interfaz de usuario se comunica con el repositorio a través de Servicios, no directamente al repositorio. (dependencia uno a uno para la interfaz de usuario).
  • Presentación: aplicación MVC (POR determinar).

Notará que también tengo la costumbre de prefijar el nombre real del ensamblado del proyecto con el FQN.

Simplemente me gusta el aspecto, además en el Explorador de objetos todo se ve bien y "como un árbol".

También tengo la costumbre de poner un número delante de la carpeta, por lo que se clasifica según "lo que necesita lo que". En otras palabras, todo depende de la capa de negocio (por lo que está en la parte superior), el repositorio solo depende del negocio, los servicios dependen del repositorio y el negocio, la presentación depende de los servicios y el negocio, etc.

Por supuesto, lo anterior es un punto de partida. Todo lo que tengo en este momento es un repositorio que devuelve usuarios y servicios que aplican lógica encima de él (filtrado).

Eventualmente tendré más proyectos de negocios, más repositorios (uno para cada área lógica de la aplicación web), más servicios (API externas, integración), y por supuesto no tengo nada en Presentación (estoy haciendo TDD).

También me gusta tener todas las dependencias en un solo lugar (carpeta del proyecto).

Para las extensiones, tengo una clase (Extensions.cs) para cada proyecto. En otras palabras, estoy " Extendiendo "el repositorio, o" Extendiendo "el servicio de usuario, o" Extendiendo " alguna funcionalidad de interfaz de usuario.

Para proyectos de prueba - tengo proyecto de prueba por proyecto de solución.

Esos son mis dos centavos (por lo que vale).

 10
Author: RPM1984,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-15 02:15:47

Hay margen de mejora.

Cualquiera de mis soluciones tiene 4 partes básicas. La Capa de Interfaz de usuario, la Capa de Negocio, la Capa de Acceso a Datos y las Utilidades. Cada parte es un proyecto.

Mi objetivo final es NUNCA escribir código en más de un lugar, sino reutilizarlo.

La interfaz de usuario y el acceso a los datos son obvios.

Cualquier cosa específica del proyecto en el que estoy trabajando entra en el proyecto Empresarial.

Las Utilidades es lo que yo llamo una biblioteca común. Estos son buenos ayudantes funciones que puedo usar en muchos proyectos. Por ejemplo, una función para ayudar en el registro.

 7
Author: David Basarab,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-18 22:01:45