2009-07-07 9 views
10

ich die folgende Projektstruktur für mein neues asp.net MVC-Projekt erstellt haben, jeder war ich nach ein Feedback, wie, wie andere Leute ihre Projekte strukturieren und wenn ich meine verbessern würde ...ASP.net MVC Projektstruktur

Hier

ist das, was ich bisher:

+Assets 
-+Images 
-+Scripts 
-+Stylesheets 
-+...    'More things like the above here 
+Controllers 
-+Support 
--+Actions   'Any custom action classes 
--+Controllers  'Base controller classes 
+Models 
-+Domain   'Contains any class that specialise view specific domain logic 
--+UrlProcessing 'Encoding/decoding business entities as URL parts 
--+...    'More things like the above here 
-+Views   'Contains view models 
--+Support 
---+Views   'Base classes for any view models 
+Support 
-+Application  'Global application interface classes (i.e. class that wraps the function of the global asax) 
-+Configuration 'Typed config classes 
-+Helpers   'Where you put additional html helper classes, etc 
-+Services 
--+Bootstrap  'Tasks that run on mvc start-up that are specific to the MVC project 
--+Inversion  'Specific IoC registration registrations for this project 
--+...    'More things like the above here 
+Views 
-+Home 
-+Shared 
-+...    'More things like the above here 

Prost Anthony

+4

Dude .. versuchen Sie einen Screenshot das nächste Mal :( –

+1

ya sollte getan haben, dass das Hosting des Bildes ist ein Problem, obwohl ... –

+1

keine Sorge über Hosting. Stackoverflow verwendet einen kostenlosen Service für diese .. –

Antwort

4

Ich habe ähnliche Struktur von Ihnen mit einigen Ausnahmen:

  1. Unterstützung benannt Infrastruktur (Namespace nur für die Verwendung der UI-Assembly)
  2. IoC befindet sich in einem anderen Projekt (Projekt für global verwendete Infrastrukturfunktionalität). UI hat StructureMaps Registry nur mit Assemblynamen (IoC wird per Konvention initialisiert). Nähern Sie sich einer gestohlenen CodeCampServer-Quelle. Logging, Konfiguration Abschnitte geht auch hier.
  3. Ansichten/[ControllerName] hat Teilunterordner, der möglicherweise noch mehr unterteilt
    (dies umfasst Jonglieren mit ViewEngine, so dass es Ansichten/Teilansichten finden konnte).
  4. Ansichten/[ControllerName] hat LocalResources-Ordner (mit Teilunterordner)
  5. Unter Controller (noch nicht) haben keine Unterordner hinzugefügt. Ich mag es, sie sauber und ziemlich dumm zu halten.

Und einig weiteren Ausnahmen im Zusammenhang mit Modell:

  1. All Business-Logik lebt in Domain Montag, Domain.Model Namespace mit etwas Hilfe von Infrastrukturschicht für die technischen Aspekte.
  2. Modelle anzeigen (ich nenne sie ViewData) lebt in der UI-Assembly unter ViewData-Ordner, strukturiert in Ordnern ähnlich wie Ansichten sind. Picked Ansatz von Kigg (außer dass ich sie pro Ansicht wie SearchViewData strukturieren, manchmal sogar pro Teilansicht).

Es funktioniert gut genug so weit

Beachten Sie, dass Viewdata Strukturierung (i meine selbst strukturieren JavaScript, um die gleiche Art und Weise, Ansicht == JS-Datei, die als [Viewname] benannt alles unter Objekt enthält) pro Ansicht ist möglicherweise nicht akzeptabel für kompliziertere Websites.

Oh ... und => Ordner == Namespace für mich. Ich denke, das ist eine gute Übung.

1

ich ein paar (kleine) Websites geschrieben haben und einfach mit der gleichen Struktur fest, die NerdDinner hatte und es schien gut zu funktionieren.

Ich denke an kleinere Projekte, das ist ein guter Ansatz, solange Sie Ihre Trennung von Bedenken haben, legen Sie keine Geschäftslogik in die Repository (s) usw. Die Versuchung auf ein kleineres Projekt ist die Linien zu verwischen, aber MVC neigt dazu, dich ein wenig zu bestrafen, wenn du das tust. :)

Größere Projekte sehen Sie möglicherweise ein separates Business-Class-Projekt umzusetzen und vielleicht sogar Datenübersetzungsprojekt usw.

1

Ich denke, das ist ein wenig zu kompliziert, aber wenn es Sinn macht, gehen Sie damit. Wichtig ist, das Gleichgewicht zu halten.

Eine Sache, die ich gerne mit separaten Projekten innerhalb der Lösung gehe, da es die Wiederverwendung von Datenzugriff und Geschäftslogik ermöglicht, um von anderen Clientanwendungstypen wie WPF oder WinForms-Clients wiederverwendet zu werden.

5

MVC-Site
app - alle statischen Dateien
--common
---- css
------ Stile-most-Seiten-use.css
- --imgs
------ Bilder-most-Seiten-use.png
---- js
------ your-custom-lib.js
--files
- --- release_notes.mdrelease_notes.html ----
--pages
---- signin
------ signin.css
------ logo.png
----- -signin.js
---- Armaturenbrett
------ dashboard.js
--vendors
---- jquery
------ jquery.1.11.1.js
-references.js

Controller - nur dünne Controller, nur Code Ihre Kernbibliotheksfunktionen
Modelle zu nennen - nur Modelle, die die Ansicht
Ansichten werden verwendet, um anzuzeigen - nur Client-Code wie html, Rasierapparat, CSS, etc

Core-Bibliothek
Grundsätzlich alle Code ... Datenzugriff, benutzerdefinierte Attribute, Dienstprogramme, etc. Den Core-Code zu einer Bibliothek zu trennen ist aus vielen Gründen praktisch. Ihre Logik ist jetzt nicht nur an eine Website gebunden. Wenn ich brauche, kann ich ein schnelles Frontend in WinForms erstellen, um einige Logik zu testen, oder ich könnte dieselben Funktionen in Ihrer Datenzugriffsebene verwenden, um ein Admin-Frontend für die Datenbank zu erstellen.

Ich finde diese Struktur die einfachste und flexibelste für mich.

aktualisiert
I'v die statische Inhalt Dateistruktur aktualisiert flexibler und modern zu sein. Ich habe diese Struktur bei der Arbeit mit AngularJS entwickelt. Ich ging schließlich weiter zu RactiveJS. Nach dem Wechsel zu RactiveJS funktionierte die gleiche Struktur sehr gut.

aktualisieren 8-21-15 I'v größere Projekte in letzte Zeit gearbeitet worden und wurde aus dem eigenen Visual Studio Projekt die Core-Bibliothek zu trennen. Dies macht es flexibel bei der Verwendung von SVN Externals. Ich kann dieselbe Bibliothek für verschiedene Projekte verwenden und muss nur ein SVN-Update durchführen, um die Änderungen zu erhalten.Außerdem brach die MVC-Site auch in ihrem eigenen Projekt aus.

+0

Ich weiß, dass Sie diese Monate beantwortet haben. Ich habe einen Zweifel. Wenn Modelle nur verwendet, um die Ansicht anzuzeigen, wo wir die Service-Funktionen setzen. Thats, wo ich mit .Say stecke, habe ich ein MemberModel (die Eigenschaften enthalten, um die Mitgliederansichten anzuzeigen), dann wo ich 'DreateMember()', 'DeleteMember()' Funktionen, die mysql Datenbankzugriff haben. Ich legte das in eine Klasse namens Memberservices und legte das in memberModel file.Ist das richtig Weg? –

+0

CreateMemember() und Funktionen wie sie sollten in der Kernbibliothek vorhanden sein, da es Geschäftslogik hat und spricht mit deine Datenbank Sie können Code in Ihrem Modell haben, der diese Funktionen aufruft. –