2012-01-12 45 views
0

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

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方法中?

感谢您的帮助。

回答

3

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

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

我担心这是唯一的方法。至少可以说是怪诞的。我只希望在整个应用程序中发生一次这种逻辑,只要我能帮助它;这样做不止一次会破坏SoC的目的。但是,如果这是我们唯一的选择,那么就这样吧。感谢您的回答:) – Chev 2012-01-12 17:31:24

+0

是的。您尝试使用IoC来分离内容,然后必须返回某种服务定位器和类似的反模式。这是我使用静态方法时遇到的问题之一。感谢微软的那一个;)很高兴我能帮忙! – 2012-01-12 17:33:51

+1

是的。我能想到的唯一选择是使用Web服务而不是web方法后面的代码,因为我可以在Web服务上执行属性注入,但是此Web方法中的逻辑被隔离到单个页面,并且仅被使用一次。似乎很愚蠢的是有一个方法的整个Web服务,但这可能比注入反模式更好。如果只有我们使用MVC。 – Chev 2012-01-12 17:35:27

0

somwhere在你的应用是Ninject的单。在webmethod中引用这个单例。 Ninject.Web.PageBase正在做类似的过程。