2012-05-04 1 views
6

私はNinjectを使っている初心者です。私はジェネリックhttpハンドラにどのように注入するのか分かりません。私はMVC3プロジェクトを持っていて、問題なくコントローラにサービスを注入しています。 これは私がサービスを登録するための私のNinject App_startクラスで得たものである:Ninjectを使っていくつかの一般的なasp.net httpハンドラにどのように注入するのですか?

 private static void RegisterServices(IKernel kernel) 
    { 
     kernel.Bind<NLSubscriber.Core.Service.Repository.INLUserRepository>().To<NLSubscriber.Core.Service.Repository.EFDAL.EFNLUserRepository>().InRequestScope(); 
     kernel.Bind<Neticon.Mvc.Helpers.IConfigHelper>().To<Neticon.Mvc.Helpers.AzureEnabledConfigHelper>().InSingletonScope(); 
     kernel.Bind<Neticon.Security.Service.IAuthenticationService>().ToMethod(m => Neticon.Security.Service.SecurityServiceFactory.CreateAuthenticationService()).InRequestScope(); 
     kernel.Bind<Neticon.Security.Service.IMembershipService>().ToMethod(m => Neticon.Security.Service.SecurityServiceFactory.CreateMembershipService()).InRequestScope(); 
     kernel.Bind<Neticon.Security.Service.IRoleManagerService>().ToMethod(m => Neticon.Security.Service.SecurityServiceFactory.CreateRoleManagerService()).InRequestScope(); 

私は([インジェクト]属性で)プロパティインジェクションを使用して、私のジェネリックハンドラからいくつかのサービスを取得しようとすると、私は常にnullを取得します。これは私のハンドラはどのように見えるかです:

readonly INLUserRepository userRep; 

    public SubscriberHandler() 
    { 

     using (IKernel kernel = new StandardKernel(new App_Start.NJRepositoryModule())) 
     { 
      userRep = kernel.Get<INLUserRepository>(); 
     } 
    } 

が、私は例外を取得しています:

public class SubscriberHandler : IHttpHandler 
{ 
    [Inject] 
    public INLUserRepository userRep { get; set;} 

    public void ProcessRequest(HttpContext context) 
    { 
     var users = userRep.GetUsers(); //userRep is always null here 
    } 


    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 

また、私はこのようにそれをやって試してみました。「エラーがNinjectコンポーネントの命令キャッシュを搭載んが、そのような部品はありません 提案: 1)KernelBaseのカスタムサブクラスを作成した場合、適切に がAddComponents()メソッドを実装していることを確認してください。 2)コンポーネントをコンポーネントのコンテナから削除していないことを確認してください。コンテナを呼び出すすべて削除する()。 3)あなたが誤って複数のカーネルを作成していないことを確認してください。」私は右、私のアプリケーションで複数のカーネルをインスタンス化することになっていないよということ? は、私が間違って何をしているのですか? おかげ

私を示唆だ

+1

可能な複製http://stackoverflow.com/questions/3629472/httphandler-property-injection-using-ninject-returning-null – Andreas

答えて

3

あなたは依存リゾルバ使用することができます。

public class SubscriberHandler : IHttpHandler 
{ 
    public INLUserRepository userRep { get; private set; } 

    public SubscriberHandler() 
    { 
     userRep = DependencyResolver.Current.GetService<INLUserRepository>(); 
    } 

    public void ProcessRequest(HttpContext context) 
    { 
     var users = userRep.GetUsers(); //userRep is always null here 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 

私はサービスロケータパターンはアンチパターンとして多くの人に考えられているので、この回答から、負のフィードバックを得ることを期待していますが

しかし、NInjectでASP.NETハンドラでインスタンス化されているため、HTTPハンドラのコンストラクタインジェクションを使用できるかどうかはわかりません。

+0

ありがとうダーリン。これは今のところ私のために働く。あなたが見ることができるように、アンチパターンについては、私はすでにそれを通過しました...つまり、インジェクション属性や他の直接参照を使用してNinjectはかなりかわいいです。しかし、私はuserRepを読み込み専用にしました。公開する必要はありません... –

+2

-1人が(たとえ彼らがSLを使う方法を人々に示しているとしても)助けようとしていませんが、この回答はhttpのdupです://stackoverflow.com/a/3629684/11635質問もこれのdupです –

+0

@RubenBartelink、あなたが投稿したdupリンクに 'ServiceLocator.Current.GetInstance ();を使用していますが、私の例ではI ASP.NET MVC 3固有のクラスである 'DependencyResolver.Current.GetService ();'を使用してください。 –

5

IHttpHandlersの構成ルートはIHttpHandlerFactoryです。 Ninjectを使用してIHttpHandlerのインスタンスを作成するカスタムIHttpHandlerFactoryを作成できます。あなたはコンストラクタインジェクションを使うことができます。

+0

これをhttp://stackoverflow.com/questions/3629472/httphandler-property-injection-using-ninject-returning-nullに貼り付けてください。 。 –

+1

Remo、どこにいてもこれを示す例がありますか? –

+0

こんにちは、これのためのサンプルコードはありますか?どのようにハンドラインスタンスを取得しますか? – veshu

関連する問題