嘿所有我试图弄清楚如何从ServiceController访问变量:ApiController如下:
namespace WebApi.App.Controllers
{
public class ServiceController : ApiController
{
string outputFile = "F:\\debugData\\debug.txt";
public bool isDebuging = false;
...etc etc
我想要获得的是 isDebuging 值,但在我的类文件中:
namespace WebApi.App.Models
{
public class checkEnviroment
{
public string checkEnviroment()
{
WebApi.App.Controllers.ServiceController["isDebuging"] = true;
etc etc...
这可能吗?我无法找到正确的语法,以便从 ServiceController:ApiController 中获取或设置值。
任何帮助都会很棒!
答案 0 :(得分:2)
检查环境应该是ActionFilterAttribute
:
public class CheckEnvironmentFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
// Use the "as" cast to don't throw an invalid cast exception
// if this attribute is applied to the wrong controller...
ServiceController serviceController =
actionContext.ControllerContext.Controller as ServiceController;
if(serviceController != null)
{
serviceController.IsDebugging = true;
}
}
}
现在将整个过滤器属性作为常规C#属性添加到ServiceController
:
[CheckEnvironmentFilter]
public class ServiceController : ApiController
...
...在从整个API控制器执行任何操作之前,将触发所谓的过滤方法。
BTW,我会按如下方式设计一个接口IDebuggable
:
public interface IDebuggable
{
bool IsDebugging { get; set; }
}
...我会在任何可能需要整个动作过滤器工作的控制器上实现它:
[CheckEnvironmentFilter]
public class ServiceController : ApiController, IDebuggable
{
public bool IsDebugging { get; set; }
}
...最后我会重构所谓的过滤器以将控制器转换为IDebuggable
:
public class CheckEnvironmentFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
// Use the "as" cast to don't throw an invalid cast exception
// if this attribute is applied to the wrong controller...
IDebuggable debuggableController =
actionContext.ControllerContext.Controller as IDebuggable;
if(debuggableController != null)
{
debuggableController.IsDebugging = true;
}
}
}
这比#1方法更好,因为现在CheckEnvironmentFilterAttribute
将支持任何实现IDebuggable
的控制器。
答案 1 :(得分:1)
将属性isDebugging
设为静态可能对ServiceController.isDebugging = true;
有所帮助,但接下来的简单问题就是为什么需要这样做。如果您需要全局属性,则可以使用Session。
答案 2 :(得分:0)
你可能做错了。这几个选择应该让你开始。最后两个选项非常适合单元测试。
如果您想要一些只在调试版中可见的调试代码,您可以使用DEBUG符号。仅当您在Visual Studio项目中有一个“已选中”复选框以定义DEBUG符号时,此方法才有效,默认情况下会对其进行检查。示例代码
#ifdef DEBUG
// your code
#endif
当您想为参数传递不同的值时,这非常有用。示例代码
public class EnvSettings
{
public bool IsDebug {get; private set;}
public EnvSettings(bool isDebug)
{
IsDebug = isDebug;
}
}
// then elsewhere
public void Foo()
{
var settings = EnvSettings(false);
if(settings.IsDebug)
{
// this is debug
}
else
{
// this is something else
}
}
public class Foo
{
public void DoFoo
{
bool isDebug = false;
var bar = new Bar();
bar.DoBar(isDebug)
}
}
public class Bar
{
public void DoBar(bool isDebug)
{
if(isDebug)
{
// this is debug set
}
else
{
// this is something else
}
}
}