2016-04-02 27 views
1

水平レイヤー(モデル、コントローラー、ビュー)の代わりに垂直スライスを持つように、MVCコアプロジェクトの構造を再構成したいと思います。各機能は1つのフォルダーその機能に関連するすべてが含まれています。このような構造のASP.NET MVCコア:カスタムコントローラファクトリ

例は次のようになります。

/Features/Home/Model.cs 
/Features/Home/Controller.cs 
/Features/Home/Index.cshtml 

は、古いプロジェクトでは、私は、カスタムコントローラの工場を書き込むことによって、これを達成しました。

質問:

  1. は、カスタムコントローラの工場は、ASP.NET MVCのコアでこれを達成するための最良の方法ですか?

  2. もしそうなら、ASP.NET MVCコアにカスタムコントローラファクトリを書き込んで注入する方法がありますか?

+1

これは、私に組み込まれたエリアのようです。 – Jasen

+0

はい、少し...しかし、領域はまだモデル、ビュー、およびコントローラのフォルダを持っています。私はフラットな構造を作りたい。しかし、私の主な懸念事項は、質問状態のタイトルとして、MVCコアでカスタムコントローラファクトリを作成して使用する方法を学ぶことです。 –

+1

このためにカスタムコントローラファクトリは必要ありません。 MVCはあなたのコントローラやモデルがどのように構造化されているか気にしません。それらはすべて最終的にDLLにコンパイルされ、プロジェクトフォルダを持つそれらの場所は無関係です。ビューは、ファイルシステムベースのものであり、フレームワークはそれらを見つける場所を知る必要があります。通常は独自のViewエンジンを意味します。また、Cielの言葉であるViewExpanderも意味します。もちろん、ツーリングはあなたの足場などの構造を理解できませんが、それは別の問題です。 –

答えて

1

私たちがASP.NET JabbRチャンネルで議論したように、あなたが望むのはViewExpanderだと思います。

エクスパンダを設定し、それを使用してフレームワークに、ビューの検索を解釈する方法を伝えます。 {0} - コントローラのアクション {1} - コントローラ名 {2} - エリア(該当する場合)

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace Microsoft.AspNet.Mvc.Razor { 

    public class ViewExpander : IViewLocationExpander { 

     public void PopulateValues(ViewLocationExpanderContext context) { 
     } 

     public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations) { 
      return viewLocations.ToList().Then(n => { 
       n.Add("/Layout/{1}/{0}.cshtml"); 
       n.Add("/Layout/{0}.cshtml"); 
       n.Add("/web/Views/{1}/{0}.cshtml"); 
       n.Add("/web/Views/Shared/{0}.cshtml"); 
      }); 
     } 
    } 
} 

その後、あなたStartup.csで、ConfigureServices方法では、あなたがそれを配線。

services.Configure<RazorViewEngineOptions>(o => { 
    o.ViewLocationExpanders.Add(new ViewExpander()); 
}); 

これらの名前の一部

は、ナイトリービルド/ビルド最新 RC2エッジに変更されているかもしれませんが、機能はまだそこにあります。

コントローラーは任意のフォルダーに移動し、必要な名前空間を設定できます。そのため、何も変更する必要はありません。

+0

名前はRC2で変更されていませんが、すべてはそのまま使用できます。この答えの完全性のために、 "Then"が拡張メソッドであることを追加する必要があります。 public static T Then (このTエンティティ、アクションアクション) { action(); return entity; } –

関連する問題