0

私は Ninject.Web.Common を使用していますが、今のところ Ninject がとても気に入っています。私はまだ依存性注入に慣れていないので、これまでのところグーグルで答えることはできませんが、かなり不自由な質問があります。IUnitOfWork 実装に依存するメッセージ ハンドラーがあるとします。ハンドラーのインスタンスを作成して Web API 構成に追加する必要があります。次のコードを使用してこれを達成することができました:

var resolver = GlobalConfiguration.Configuration.DependencyResolver;
            config.MessageHandlers.Add((myproject.Filters.ApiAuthHandler)resolver.GetService(typeof(myproject.Filters.ApiAuthHandler)));

私はこの種のものを入力するのが本当に嫌いなので、私はそれを正しくやっているのだろうかと思っています. 依存オブジェクトを手動で構築する一般的な方法は何ですか?

4

1 に答える 1

0

私が実際のプロジェクトで依存性注入を使用したのはわずか半年前のことなので、このようなことにはかなり慣れていません。すべての概念がかなり詳しく説明されている.NET ブックでの Dependency Injectionを本当にお勧めします。そこから多くのことを学びました。

これまでのところ、私にとって最もうまくいったのは、次のようにデフォルトのコントローラーファクトリーを上書きすることです:

public class NinjectControllerFactory : DefaultControllerFactory
{
    private IKernel _kernel;

    public NinjectControllerFactory()
    {
        _kernel= new StandardKernel();
        ConfigureBindings();
    }

    protected override IController GetControllerInstance(RequestContext requestContext,
        Type controllerType)
    {
        return controllerType == null
            ? null
            : (IController)_kernel.Get(controllerType);
    }

    private void ConfigureBindings()
    {
        _kernel.Bind<IUnitOfWork>().To<MessageHandler>();
    }
}

Application_Start 関数の Global.asax では、次の行を追加するだけです。

ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());

このアプローチはコンポジション ルート パターンと呼ばれ、依存性注入の "良い" 方法と見なされます。

サービスや他のワーカーなどのエンドポイントが複数ある場合は、 Application.CompositionRoot プロジェクトを作成し、そこでアプリケーションのさまざまなエンドポイントのさまざまなバインディング構成を処理することをお勧めします。

于 2013-01-25T19:36:09.447 に答える