2012-04-13 58 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