7

私は Ninject を使用する初心者であり、一般的な http ハンドラーに挿入する方法がわかりません。私は MVC3 プロジェクトを持っており、サービスをコントローラーにまったく問題なく注入しています。これは、サービスを登録するために Ninject App_start クラスで取得したものです。

        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();

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

    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;
        }
    }
}

私も次のようにしてみました:

    readonly INLUserRepository userRep;

    public SubscriberHandler()
    {

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

「Ninject コンポーネント ICache のロード中にエラーが発生しました。カーネルのコンポーネント コンテナーにそのようなコンポーネントは登録されていません。提案: 1) KernelBase のカスタム サブクラスを作成した場合は、AddComponents( ) メソッド。2) RemoveAll() の呼び出しによってコンテナーからコンポーネントを削除していないことを確認してください。3) 誤って複数のカーネルを作成していないことを確認してください。」

これは、アプリケーションで複数のカーネルをインスタンス化してはならないことを示唆していますよね? 私は何を間違っていますか?ありがとう

4

3 に答える 3

8

依存関係リゾルバーを使用できます。

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;
        }
    }
}

多くの人がサービスロケーターパターンをアンチパターンと見なしているため、この回答から否定的なフィードバックが返されることを期待しています。

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

于 2012-05-04T10:07:23.247 に答える
6

IHttpHandlersの合成ルートはIHttpHandlerFactory. IHttpHandlerFactoryNinject を使用して のインスタンスを作成するカスタムを作成でき ますIHttpHandler。そうすれば、コンストラクターインジェクションを使用できます。

于 2012-05-04T10:47:46.977 に答える