web-dev-qa-db-ja.com

.NET MVCの理想的なフォルダー構造

.NET Webフォームを始めたとき、VSが「App_Code」などのアプリケーションフォルダーを提供し、ほとんどのアプリの例では「BLL」、「DAL」などがそこに配置されているため、フォルダー構造を見つけるのにそれほど問題はありませんでした。

しかし、現在MVCでは、チェックするすべての例が異なる構造を使用しています。今回は標準がないため、GoogleやSOで適切なソリューションを見つけていません。

ですから、MVCプロジェクトの編成方法を共有したり、他の人が自分の心を作るのに役立つかもしれません。以下は、私が使用する中小規模のプロジェクトの構造です。

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

あなたはどうですか?

35
Nestor

Webサイトプロジェクトにコンテンツのみが含まれている(コンパイルされたコードは含まれていない)と、展開が簡単になることがわかりました。

何かのようなもの:

Web.Siteプロジェクト

   Content
      Images
      Css
   Scripts
   Views
   web.config

そして、すべてのコンパイル済みコードを別のプロジェクトに移動します。

Webプロジェクト

   Controllers
   Filters
   Models
   ...

次に、Web.Siteプロジェクト内のすべてを展開する必要があるものとして扱うことができ、必要なすべてのアセンブリはWeb.Site\binにあります。

単純なxcopy展開を実行している場合でも、WiXを使用してMSIパッケージを構築している場合でも、これにより作業が少し簡単になります。

15
MJ Richardson

2つのプロジェクトのアプローチの2番目です。 Jimmy Bogardは アプローチに関する素敵な投稿 も持っています(必ずすべてのコメントを確認してください)。

私は個人的に、アプリケーションの一部で作業しているときに、関連するサービス、コントローラー、リポジトリーなどを使用します。これらのファイルをそれぞれ別のフォルダーに入れると、何度も行ったり来たりするのが面倒になります。 。いくつか遊んだ後、私はこのフォーマットに従ってきました:

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)

テストプロジェクト

  ...

私は、プロジェクトをさらに分解して、InterfaceおよびViewModelサブフォルダーを使用するかどうかに依存すると思います。それは完璧ではありませんが、私はそれが私が思う方法でよりよく一致することを発見しました。

サービスとリポジトリを3番目のプロジェクト(AppName.Core)に配置し、AppName.Web.CoreプロジェクトをWeb関連パーツ(Attributes、Controllers。ViewModelsなど)のみをカプセル化したままにすることもできます。繰り返しますが、これはプロジェクトの複雑さに関係しています。

6
TheRightChoyce

どこにあるかがはっきりしている限り、あまり問題ではありません。組織/グループ内で一貫していることが問題だと思います。

5
dreadwail