2

次の httphandler があります。

public class NewHandler : IHttpHandler
{
    [Inject]
    public IFile FileReader
    {
        get;
        set;
    }

    public NewHandler()
    {
    }

    public void ProcessRequest(System.Web.HttpContext context)
    {
        ....
        var something = SomeMethod(FileReader);
        ....
    }

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

これは Global.asax の Ninject モジュールです。

internal class ServiceModule : NinjectModule
{
    public override void Load()
    {
        Bind<IFile>().To<FileWrapper>().InSingletonScope();
    }
}

ハンドラーが起動するたびに、FileReader は NULL です。何か不足していますか?これは、Ninject を使用してプロパティ インジェクションを行う正しい方法ですか?

ありがとう

4

2 に答える 2

3

これは Ninject でプロパティ インジェクションを行う正しい方法ですが、うまくいきません。おそらく、クラスのようなものNinjectMvcApplicationをアプリケーションの基本クラスとして使用しています。これは、コントローラーの依存性注入と、コントローラーが使用する可能性のあるすべてのもの (サービス、リポジトリ) を処理します。しかし、HttpHandlers は によってインスタンス化されないControllerFactoryため、何も注入を処理しません。

もっと良い方法があるかもしれませんが、サービスロケーターを使用して依存関係を解決しました。http://code.dortikum.net/2010/08/05/asp-net-mvc-di-with-common-service-locator-and-ninject/を参照してください。

アップデート:

次のようなことを試してください:

public class NewHandler : IHttpHandler
{
    private readonly IFile _fileReader;

    public NewHandler()
    {
        _fileReader = ServiceLocator.Current.GetInstance<IFile>();
    }

    public void ProcessRequest(System.Web.HttpContext context)
    {
        ....
        var something = SomeMethod(_fileReader);
        ....
    }

    public bool IsReusable
    {
        get
        {
            return true;
        }
    }
}
于 2010-09-02T17:41:49.163 に答える