4

私は 2 つの異なるプロジェクトを持っていますが、実際には展開すると 2 つの異なる Web サイト (WebA と WebB など) になります。両方の Web サイトの構造は、使用するコントローラーとモデルに関して同じです。ただし、フロントエンドは大きく異なります。それぞれ独自の UI と、独自の jquery プラグインを備えています。

コードの重複を減らすために、これらのプロジェクトは両方とも、参照されている別のプロジェクト [controllerDLL] のコントローラーから継承することを提案しています。ControllerDLL は、ビジネス レイヤーを呼び出して JSON のシリアル化されたモデル オブジェクトを返すためのすべてのロジックを持つプロジェクトです。WebA と WebB にはそれぞれ、基本プロジェクト [controllerDLL] から継承する空のコントローラー クラスがあります。このように、コントローラーのコードが重複していないと感じています。

私が提案した方法以外に、コントローラーの再利用を実現するためのより良い方法を誰か教えてもらえますか? asp.net mvc 4 は、これを改善する組み込みの方法を提供していますか? ここでAREASを生産的に使用できますか? DotNetNuke は私が見るべきものですか? それとも私のアプローチが最善の方法ですか?コントローラーを別のプロジェクトに移動する方法を探していません。コントローラーの再利用を実現するためのオプションを知りたいだけです。

ありがとう。

4

3 に答える 3

2

カスタムコントローラーファクトリーを実装して、構成設定に基づいて適切なコントローラークラスをインスタンス化することにより、これを実現できるはずです。

インターフェイス System.Web.Mvc.IControllerFactory を実装する必要があります。このインターフェイスの 2 つのメソッドは次のとおりです。

1.System.Web.Mvc.IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName)- RequestContext とコントローラー名に基づいてコントローラー インスタンスを作成する。

2.void ReleaseController(System.Web.Mvc.IController controller)- コントローラ インスタンスを解放する

そのインターフェースの使用に関する詳細情報が利用可能です

于 2013-08-21T14:26:02.897 に答える
2

このSO questionを見てください。すべてのビューを同じプロジェクトに保持し、カスタム ビュー エンジンを使用して (web.config 設定に基づいて) ビューを見つけることができます。

たとえば、/Views/WebA と /Views/WebB の 2 つのフォルダーを作成できます。カスタム ビュー エンジンは、web.config 設定を検索して、使用するフォルダーを見つけ、そこでビューを検索できます。これにより、コントローラー コードを複製したり、別のプロジェクトに移動したりする必要がなくなります。実行時にプレゼンテーション レイヤーを別のレイヤーに交換するだけです。

于 2013-08-21T14:22:01.717 に答える
0

2 つのアプリケーションの違いはビューであるため、それらを別々のプロジェクトとして持つ必要はありません。2 セットのビューを作成し、Web 構成の異なる設定を使用して同じプロジェクトを 2 回デプロイすることができます。これを行うには、独自の ViewEngine を実装して、コントローラーが正しい正しいビューを返せるようにする必要があります。

public class AppSettingViewEngine: RazorViewEngine
{
    public AppSettingViewEngine()
    {
        string[] viewLocations = new string[] { };
        if (ConfigurationManager.AppSettings["Site"] == "WebA")
        {
            viewLocations = new[] {  
                "~/WebB/Views/{1}/{0}.cshtml",  
                "~/WebB/Views/{1}/{0}.cshtml",  
                "~/WebB/Views/Shared/{0}.cshtml",  
                "~/WebB/Views/Shared/{0}.cshtml",
            };
        }
        if (ConfigurationManager.AppSettings["Site"] == "WebB")
        {
            viewLocations = new[] {  
                "~/WebB/Views/{1}/{0}.cshtml",  
                "~/WebB/Views/{1}/{0}.cshtml",  
                "~/WebB/Views/Shared/{0}.cshtml",  
                "~/WebB/Views/Shared/{0}.cshtml",
            };
        }
        else
        {
            //Default Settings
            viewLocations = new[] {  
                "~/Views/{1}/{0}.cshtml",  
                "~/Views/{1}/{0}.cshtml",  
                "~/Views/Shared/{0}.cshtml",  
                "~/Views/Shared/{0}.cshtml",
            };
        }

        this.PartialViewLocationFormats = viewLocations;
        this.ViewLocationFormats = viewLocations;
    }
}

次に、次のように Application_Start に登録します

protected void Application_Start()
{
    ViewEngines.Engines.Clear();
    ViewEngines.Engines.Add(new AppSettingViewEngine());
}
于 2013-12-13T11:28:27.633 に答える