2011-07-08 2 views
2

Ninject設定のRemo Gloor(main dev)との相談に続いて、.NET memory profiling/risks for leaks/Ninject/Direct delegate rootsについて、ASP.NET Webフォームアプリケーションで適切に設定することを明確にしたいと思います。Ninjectの設定

私たちは次のことを行っている現在の要件を持っている:私たちはNinjectでこれを表現するためにどのように最善の

public static T GetDefault<T>(this IKernel kernel) 
{ 
    return kernel.Get<T>(m => m.Name == null); 
} 

public static object GetDefault(this IKernel kernel, Type type) 
{ 
    return kernel.Get(type, m => m.Name == null); 
} 

public static T GetNamedOrDefault<T>(this IKernel kernel, string name) 
{ 
    T result = kernel.TryGet<T>(name); 

    if (result != null) 
     return result; 

    return kernel.GetDefault<T>(); 
} 

public static object GetNamedOrDefault(this IKernel kernel, Type type, string name) 
{ 
    var result = kernel.TryGet(type, name); 

    if (result != null) 
     return result; 

    return kernel.GetDefault(type); 
} 

Bind<ISearchService>() 
    .ToMethod(ctx => new BaseSearchService(ctx.Kernel.GetDefault<IDataRetrievalService>())) 
    .InSingletonScope() 
    .Named("BaseSearchService"); 

Bind<ISearchService>() 
    .ToMethod(ctx => new HttpSearchService(
     ctx.Kernel.GetNamedOrDefault<ISearchService>("BaseSearchService"), 
     HttpContext.Current)) 
    .InRequestScope(); 

GetNamedOrDefaultは、我々が持っている拡張メソッドのですか? "WhenParentNamed"を使用して、Ninjectにコンストラクタに渡すオブジェクトを決定させる必要がありますか?

同様に、現在のHttpContext.Currentオブジェクトをバインドすると、コンストラクタがそのパラメータの1つとしてHttpContextオブジェクトを取得するたびにNinjectがそのオブジェクトを使用することがわかります。それはここに見られるのと同じでしょうか?

https://github.com/ninject/ninject.web.mvc/blob/master/mvc3/src/Ninject.Web.Mvc/MvcModule.cs

我々はリクエストスコープを利用している場合は、私たちはOnePerRequestModuleを使用して、アプリケーションのWeb.configファイルでこれを設定すべきですか?

は、我々はまた、使用する必要があります。

https://github.com/ninject/Ninject.Web.Common/blob/master/src/Ninject.Web.Common/NinjectHttpApplication.cs

私たちのオブジェクトが適切に配置されていることを確認するには?

これはいくつかの人にとっては非常に単純なように思えるかもしれませんが、私は誰もが取るアプローチを明確にしたいだけです。

おかげで、いくつかの条件付き結合(例えばWhenParentNamed、WhenClassHas、WhenTargetHasまたはcuston)を使用した装飾の場合は

答えて

2

は行くための最良の方法です。

Bind<ISearchService>() 
    .To<BaseSearchService>() 
    .InSingletonScope() 
    .WhenParentNamed("HttpServiceDecorator"); 

Bind<ISearchService>() 
    .To<HttpSearchService>() 
    .Named("HttpServiceDecorator") 
    .InRequestScope(); 

Bind<HttpContext>().ToMethod(ctx => HttpContext.Current); 

サービスを取得する最善の方法は、サービスを必要とするクラスのコンストラクタに挿入することです。 HttpSearchServiceのインスタンスを受け取るのに特別なものは必要ありません。デフォルトとして渡されます。

Ninject.Web 2.2以降、OnePerRequestModuleがデフォルトで使用されます。したがって、変更は必要ありません。

Ninject.Web.Commonは、最新のNinject 2.4リリースに導入されました。これは、すべてのWeb拡張機能で使用される基本コンポーネントです。これは、あなたが2.2にとどまっている限り、それを使用してはならないことを意味します。 2.4(または2.3開発ビルド)に切り替えるとすぐにそれを使用する必要があります。

+0

ありがとうございました - 私が達成しようとしているのは、私のデコレータパターン実装用のバインディングを設定することです。私は常に名前なしでカーネル、サービスロケータでGetを使いたい。戻ってくるものは、構成によって決まります。私はWhenInjectedInto条件でこれを達成しましたが、上記の仕組みが現時点では見えません。私は名前を要求する必要があると推測します - HttpServiceDecorator? –

+0

いいえ、名前を指定する必要はありません。無条件であるため、HttpServiceServiceが返されます。名前は単なるメタデータであり、それ自体ではまったく死ぬことはありません。また、ServiceLocationを取り除き、NinjectをIoCコンテナとして使用し始めます。 http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspxを参照してください。Ninject.Web拡張機能を使用すると、コンテナがあることを知る必要がある唯一の場所がコンフィグレーションであるデザインを作成できます。 –

関連する問題