2013-08-21 86 views
4

我有兩個不同的項目,當部署時實際上是兩個不同的網站,比如WebA & WebB。兩個網站的結構在他們使用的控制器和模型方面是相同的。但是,前端是非常不同的。他們每個人都有自己的用戶界面和自己的jquery插件,爲他們工作。控制器在asp.net中的重用mvc

爲了減少代碼重複,我建議這兩個項目都是從另一個引用項目[controllerDLL]中的控制器繼承的。 ControllerDLL是一個具有調用業務層和返回json序列化模型對象的所有邏輯的項目。 WebB & WebB將分別擁有隻從基礎項目[controllerDLL]繼承的空控制器類。這樣我覺得控制器代碼不會重複。

任何人都可以告訴我一個更好的方法來實現控制器重用,而不是我提出的方式嗎? asp.net mvc 4是否提供了更好的內置方法?我可以在這裏有效地使用AREAS嗎? DotNetNuke是我應該看的東西嗎?或者我的方法是最好的前進方向?我不在尋找如何將控制器移到另一個項目中。我只想知道我的選擇是實現控制器重用。

謝謝。

+0

http://dotnetslackers.com/articles/aspnet/storing-asp-net-mvc-controllers-views-in-separate- assemblies.aspx – Satpal

回答

2

看看這個SO question。您可以將所有視圖保留在同一個項目中,並使用自定義視圖引擎來查找視圖(基於web.config設置)。

例如,您可以有2個文件夾/視圖/ WebA和/ Views/WebB。自定義視圖引擎可以查找web.config設置來找出要使用的文件夾並在那裏搜索視圖。這樣您就不必複製控制器代碼或將其移入單獨的項目中。它只會在運行時換出一個表示層。

+1

我不確定這種方法,因爲他們說他們的兩個項目實際上是作爲兩個獨立的站點部署的。如果將兩個項目的觀點合併爲一個,我認爲不可能再單獨部署它們。 – asymptoticFault

+0

@asymptoticFault我不明白你爲什麼不能單獨部署它們。如果您將web.config設置更改爲使用正確的視圖,那麼阻止您將其部署到10個不同的服務器/站點是什麼? – Becuzz

+0

我指的是能夠將兩組視圖部署爲不同的站點,因爲這是他們想要的。 – asymptoticFault

2

您應該可以通過實現自定義控制器工廠來實現此目的,以根據配置設置實例化正確的控制器類。

您需要實現該接口System.Web.Mvc.IControllerFactory.The在這個界面兩種方法是:

1.System.Web.Mvc.IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName) - 要創建基於的RequestContext和控制器名稱控制器實例。

2.void ReleaseController(System.Web.Mvc.IController controller) - 鬆開控制器實例

Detailed information about using that interface is available

+0

你也可以看看下面的鏈接:http://stackoverflow.com/questions/401376/asp-net-mvc-put-controllers-into-a-separate-project – DarthVader

0

由於這兩個應用程序之間的差異是意見,你不需要把他們作爲單獨的項目。您可以擁有兩組視圖,並使用Web配置中的不同設置兩次部署相同的項目。爲此,您必須實現自己的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()); 
}