29

Cuando comencé en .NET Webforms no tuve problemas para encontrar una estructura de carpetas a seguir, ya que VS me ofreció carpetas de aplicaciones como "App_Code" y la mayoría de ejemplos de aplicaciones ponen "BLL", "DAL" adentro y así sucesivamente.Una estructura de carpetas ideal para .NET MVC

Pero ahora en MVC, cada ejemplo que verifico usa una estructura diferente, como no hay estándares esta vez y no he encontrado una buena solución en Google o SO.

Entonces, tal vez podamos compartir cómo organizamos nuestros proyectos de MVC, puede ayudar a otros a hacer su propia opinión. Aquí está la estructura para proyectos pequeños a medianos que uso:

App_Data 
Areas 
    Admin 
     Controllers 
     Models 
     Views 
    MyAccount 
     Controllers 
     Models 
     Views 
Content 
    Images 
    Scripts 
    Styles 
Controllers 
    HomeController.cs 
Helpers 
    ExtensionMethods // I.e. based on HtmlHelper, use "helper" suffix 
     MenuHelper.cs // to be called as html.Menu() 
    Utilities.cs // Other generic (static) libraries, no suffix used 
Models 
    ViewModels // for passing models to Views 
     RegisterViewModel.cs // use "ViewModel" suffix 
    Customer.cs // to extend models like adding Model Validation 
Repositories 
    CustomerRepository.cs // use "Repository" suffix 
Services 
    CustomerService.cs // use "Service" suffix, to move code away from controllers 
Views 
    Home 
     Index.cshtml 
     Register.cshtml 
    Shared // Site Layouts (Master templates), also put partials here 
     SiteLayout.cshtml 

¿Qué tal el tuyo?

+0

Posiblemente noob pregunta: aunque he estado usando ASP.NET MVC durante mucho tiempo, nunca he encontrado '.cshtml'! ¿Que es eso? :) –

+1

@Maxim; Eso es Razor. – Pradeep

+1

Sí, eso es una máquina de afeitar, el nuevo motor de vista predeterminado en MVC3, es más limpio y hace que el código sea más legible, puede consultar un blog de Scott Gu: http://weblogs.asp.net/scottgu/archive/2010/07/02 /introducing-razor.aspx – Nestor

Respuesta

4

Mientras que esté claro dónde están las cosas, no importa mucho. Creo que solo se trata de ser coherente dentro de su organización/grupo.

+2

Lo sé, pero generalmente quiere establecer su estándar antes de comenzar la "producción en serie" de sitios web, y desea que su estándar sea lo mejor que pueda imaginar. Debido a algunos ejemplos consistentes, pasé casi todo el día saliendo con esto, así que tal vez podamos ahorrar tiempo a otros al compartir nuestras estructuras "sugeridas". – Nestor

+0

¿qué piensas de esto? http://www.dotnetexpertguide.com/2012/01/dividing-mvc-components-in-separate.html – user20358

13

He encontrado que simplifica la implementación para que el proyecto del sitio web contenga solo contenido (sin código compilado).

Algo así como:

proyecto Web.Site

Content 
     Images 
     Css 
    Scripts 
    Views 
    web.config 

Y mover todo el código compilado en otro proyecto:

proyecto Web

Controllers 
    Filters 
    Models 
    ... 

Luego, puede tratar todo lo que se necesite implementar dentro del proyecto Web.Site, y todos los ensamblados necesarios estarán en Web.Site \ bin.

Ya sea que esté realizando un despliegue simple de xcopy, o usando WiX para construir un paquete MSI, esto hará la vida un poco más fácil.

+2

Lo segundo. Mis proyectos generalmente se organizan con un proyecto 'Web' y luego un proyecto 'Web.Components'. El proyecto 'Web' tiene muy poco código, mientras que 'Web.Components' contiene todo como Controladores y Filtros. Finalmente, tengo un proyecto 'Core' que contiene mis modelos. –

+0

Muy interesante, sí, me gusta también, lo consideraré para mis propios proyectos. Gracias por compartir. – Nestor

5

I segundo el enfoque de dos proyectos. Jimmy Bogard tiene un nice post on the approach también (asegúrese de revisar todos los comentarios).

Personalmente encuentro que cuando estoy trabajando en una parte de una aplicación utilizo servicios relacionados, controladores, repositorios, etc. y cuando coloca cada uno de estos archivos en una carpeta diferente puede volverse tedioso y volver atrás. adelante y encontrándolos. Después de algún jugando He estado siguiendo este formato:

AppName.Web.UI

Scripts 
Content 
View 

AppName.UI.Core

Attributes 
Filters 
Formatters 
Helpers 
Models 
    Company 
    Interfaces 
     IController.cs 
     IRepository.cs 
     IService.cs 
    ViewModels 
     ViewModel1.cs 
     ViewModel2.cs 
    Controller.cs 
    Repository.cs 
    Service.cs 
    User 
    .... 
Plugins (mailchimp, Twitter OAuth, etc..) 
Global.asax (define all the code here rather than in the UI project) 

proyecto de la prueba

... 

Creo que depende de qué tan grande sea su proyecto en cuanto a si se desglosa y utiliza las subcarpetas Interface y ViewModel. No es perfecto, pero he encontrado que se combina mejor con la forma en que pienso.

El caso también se puede hacer para poner sus servicios y repositorios en un tercer proyecto (AppName.Core), dejando el proyecto AppName.Web.Core que encapsula solo las partes relacionadas con la Web (Atributos, Controladores, Modelos de Vista, etc.) . Una vez más, eso realmente se relaciona con la complejidad del proyecto.

+0

Me gusta también. Gracias. – Nestor

+0

Leí la publicación que menciona y tengo una pregunta para esta estructura, ¿cómo usarla con Áreas? Debido a que las áreas tienen sus propios modelos, los controladores, las vistas y los controladores de área son diferentes de los controladores en la raíz, entonces, ¿cómo dividir esto usando IU, Core? – Nestor

+0

Personalmente, no me he acostumbrado a usar tanto las áreas, pero debería poder descomponerlas lógicamente de manera similar. Agregaría el área al proyecto de UI y luego movería el controlador relacionado al proyecto Core. Siempre que los espacios de nombres se mantengan iguales, la estructura física del proyecto no debería importar. O, dependiendo de si desea que sus áreas sean reutilizables en diferentes proyectos, puede tener un solo proyecto para cada área y hacer referencia a ellos en su proyecto principal ... realmente depende de cuál sea su objetivo para las diferentes áreas. – TheRightChoyce

Cuestiones relacionadas