【问题标题】:How to access my variables in a web method?如何在 Web 方法中访问我的变量?
【发布时间】:2012-01-12 17:21:25
【问题描述】:

我正在使用 ASP.NET Webforms,并且在一个页面中,我想在后面的代码中对 Web 方法进行 AJAX 调用。问题是 Web 方法是静态的,我无法访问页面变量。我需要能够让 Ninject 注入依赖项。有没有办法在网络方法中做到这一点?

public partial class Default : Ninject.Web.PageBase
{
    [Inject]
    public ISecurityController SecurityController { get; set; }


    [WebMethod]
    public static string DoSomething()
    {
        SecurityController.WriteToLog(); // Can't access SecurityController because it doesn't exist.
    }
}

由于 web 方法是静态的,因此将它放在页面背后的代码中几乎看起来很愚蠢,因为它实际上无法与页面交互。它是背后代码中的一个孤岛。有没有更好的方法来实现这一点?或者至少有一种方法可以让 Ninject 以某种方式将 ISecurityController 注入 web 方法?

感谢您的帮助。

【问题讨论】:

    标签: c# asp.net .net ajax webforms


    【解决方案1】:

    您可以使用IKernel.Get<T>() 方法直接从内核中检索它:

    [WebMethod]
    public static string DoSomething()
    {
        NinjectModule module = new YourModule();
        IKernel kernel = new StandardKernel(module);
        var controller = kernel.Get<ISecurityController>();
        controller.WriteToLog();
    }
    

    【讨论】:

    • 我担心这是唯一的方法。至少可以说是荒谬的。如果我能提供帮助,我只希望在整个应用程序中让这个逻辑出现一次;不止一次这样做会违背 SoC 的目的。但是,如果这是我们唯一的选择,那就这样吧。谢谢你的回答:)
    • 是的。您尝试使用 IoC 解耦事物,然后必须回到某种服务定位器和类似的反模式。这是我在使用静态方法时遇到的问题之一。感谢微软 ;) 很高兴我能帮上忙!
    • 是的。我能想到的唯一替代方法是使用 Web 服务而不是 Web 方法背后的代码,因为我可以在 Web 服务上进行属性注入,但是这个 Web 方法中的逻辑被隔离到单个页面并且只使用一次。为一种方法提供完整的 Web 服务似乎很愚蠢,但这可能比注入反模式更好。要是我们使用 MVC 就好了。
    • Jason 下面提到的方法对我来说似乎更有意义,但在尝试了两种方法之后,我发现这种方法更加优雅。拥有这种丑陋的东西比拥有全局静态类更好。
    【解决方案2】:

    在您的应用程序中某处是 Ninject 的单例。在 web 方法中引用这个单例。 Ninject.Web.PageBase 中正在进行类似的过程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-11
      • 1970-01-01
      • 1970-01-01
      • 2016-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-28
      相关资源
      最近更新 更多