2012-04-13 93 views
0

我正在使用MVC3,我需要將同一網站部署到多個位置,但禁用某些控制器。要禁用的控制器共享相同的基本控制器類。通過編譯配置禁用基於編譯器開關的控制器

我想我應該能夠使用不同的構建配置來完成這一點,每個配置都有一組不同的編譯器開關來控制啓用或禁用哪一組控制器。

我無法確定實現此目標的最佳方法。誰能幫忙?也許在OnActionExecuting

謝謝

+2

我認爲最好的辦法是在Global.asax中路由 – BigMike 2012-04-13 12:00:05

+0

想法不錯,我沒有想到的是工作! – enashnash 2012-04-13 12:51:25

回答

0

也許是Creating custom route constraint和使用ConditionalAttribute

東西沿着這些路線:

public class DisabledControllersRouteConstraint : IRouteConstraint 
{ 
    IList<string> DisabledControllers = new List<string>(); 

    public DisabledControllersRouteConstraint() 
    { 
     DisableConstrollersDebug(); 
     DisableConstrollersRelease(); 
     DisableConstrollersProduction(); 
    } 

    [Conditional("RELEASE")] 
    private void DisableConstrollersRelease() 
    { 
     DisabledControllers.Add("ControllerDisabledForRelease"); 
    } 

    [Conditional("PROD")] 
    private void DisableConstrollersProduction() 
    { 
     DisabledControllers.Add("ControllerDisabledForProduction"); 
    } 

    [Conditional("DEBUG")] 
    private void DisableConstrollersDebug() 
    { 
     DisabledControllers.Add("ControllerDisabledForDebug"); 
    } 

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     var controller = values["controller"]; 

     return !DisabledControllers.Contains(controller); 
    } 
} 
+0

我不明白這是如何工作的基地控制器? – enashnash 2012-04-13 12:57:49

+0

你用基礎控制器看到了什麼問題?如果你添加更多的細節,我會盡力幫助你 – archil 2012-04-13 13:47:14

+0

正如我在問題中所說的,控制器禁用所有共享相同的基本控制器。按照您描述的方式進行操作時,需要保留從基類繼承的控制器列表。更不用說用字符串來描述它們了。看起來我可以通過使用基類上的Conditional屬性(如果可行)或者通過簡單地使用反射來找到基類控制器'Type'的繼承者來創建我的列表。 – enashnash 2012-04-13 14:15:33

0

您是否在討論根據活動配置的條件編譯?

轉到項目屬性 - >建設 - >條件編譯符號,並添加字符串常量

然後,你可以這樣寫代碼:

#if TESTCFGACTIVE 
     Console.WriteLine("Test CFG Constant"); 
#else 
     Console.WriteLine("Normal"); 
#endif 
     Console.ReadLine(); 

在釋放模式和調試模式下運行,這將產生不同的產出,顯然。

不完全確定這是否是你之後的事情,但我謹慎使用它,例如在不同的環境中禁用和啓用調試/日誌記錄功能。

對於類似於您所談論的內容,更多的是關於應用程序的行爲,我將使用簡單的配置設置打開或關閉控制器。然後,您可以使用構建腳本將相關的配置文件部署到相關的輸出目錄。

+0

是的,我意識到這一點,我的問題是關於如何從其基類禁用控制器,而不是條件編譯如何工作。 – enashnash 2012-04-13 12:54:58