2012-01-12 1 views
0

私はASP.NET Webformsを使用しています。あるページで、コード内のWebメソッドにAJAX呼び出しを行いたいとします。問題は、Webメソッドが静的で、ページ変数にアクセスできないということです。私はNinjectに依存性を注入させる必要があります。 Webメソッドでこれを行う方法はありますか?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. 
    } 
} 

ウェブメソッドが静的であるため、ほとんどそれが実際のページと対話することはできませんので、偶数ページのための背後にあるコードでそれを持っている愚かなようです。それはコードの中の孤立した島です。これを達成するより良い方法はありますか?または、少なくとも私はNinjectが何らかの方法でWebメソッドに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を使って物事を解体しようとしています。そして、ある種のサービスロケータと同様のアンチパターンに戻らなければなりません。これは私が静的メソッドで持つ問題の1つです。その1つのためにマイクロソフトに感謝;)私は助けることができてうれしい! –

+1

うん。私が考えることのできる唯一の代替案は、Webサービスのプロパティインジェクションを行うことができるので、Webメソッドの背後にあるコードの代わりにWebサービスを使用することです。このWebメソッドのロジックは単一のページに分離され、 1つのメソッドに対してWebサービス全体を持つのは馬鹿だと思われますが、それはおそらく注入アンチパターンよりも優れています。私たちがMVCを使用していただけの場合。 – Chev

0

somwhereはNinjectのシングルトンです。ウェブメソッド内でこのシングルトンを参照してください。同様のプロセスがNinject.Web.PageBaseで実行されています。

関連する問題