2012-01-12 1 views
0

Я использую ASP.NET Webforms, и на одной странице я хочу сделать вызов AJAX веб-методу в коде позади. Проблема в том, что веб-методы являются статическими, и я не могу получить доступ к переменным страницы. Мне нужно, чтобы 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. 
    } 
} 

Поскольку веб-методы являются статическими почти кажется глупо даже иметь его в код для страницы, потому что он фактически не может взаимодействовать со страницей. Это изолированный остров в коде. Есть ли лучший способ сделать это? Или, по крайней мере, есть способ, которым я могу каким-то образом внедрить инъекционный метод ISecurityController в веб-метод?

Спасибо за помощь.

ответ

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

+0

Да. Вы пытаетесь разделить вещи с помощью IoC, а затем должны вернуться к некоторому локатору сервисов и аналогичным анти-шаблонам. Это одна из проблем со статическими методами. Спасибо Microsoft за это;) Рад, что я мог бы помочь! –

+1

Да. Единственная альтернатива, которую я могу придумать, - это использовать веб-службу вместо кода, лежащего за веб-методом, потому что я могу делать вложение свойств в веб-службу, но логика в этом веб-методе изолирована от одной страницы и используется только один раз. Кажется глупым иметь всю веб-службу для одного метода, но это, вероятно, лучше, чем анти-шаблон инъекции. Если бы мы использовали MVC. – Chev

0

Somwhere в приложении одноэлементно из Ninject. ссылайтесь на этот синглтон в веб-методе. аналогичный процесс выполняется в Ninject.Web.PageBase.