次の基本的なプロジェクト設定を想定しましょう。
- Core
-- Attributes
--- CustomDisplayNameAttribute : DisplayNameAttribute
- UI
UI は MVC Web インターフェイスを表し、コアはすべてのドメイン ビジネス オブジェクトを実装しますCustomDisplayNameAttribute
。この属性には、言語リゾルバなどの追加の依存関係が含まれます。たとえば、フォールバック オーダーを処理します。Hibernate セッションは、別の依存関係になる可能性があります。
以前のプロジェクトでは、これらの属性はリゾルバーを取得するためにグローバル リクエストを実行していました。これは IMO の醜さであり、別の方法で処理する必要があります。さらに、コアはなしのままにしておく必要があります。HttpContext
リクエストごとに言語リゾルバーが必要なため、HttpContext
Items コレクションになる可能性があります。
今、私はNinjectの初心者であり、そのような依存関係をCustomDisplayNameAttribute
?
言葉にすると、次のようになります。
- 属性が作成されている場合は、追加の言語リゾルバー プロパティに
HttpContext
Items コレクションの言語リゾルバーを設定します。 - ない場合
HttpContext
(例: テスト、クオーツの仕事など)、どこかから入手してください。
入力のThx
編集:サンプルコード
namespace Core.Attributes
{
public class CustomDisplayNameAttribute : DisplayNameAttribute
{
private string textCode;
/// <param name="textCode">According to this Text-Code, we will load
/// and resolve the text.</param>
public DeimosDisplayNameAttribute(string textCode)
{
this.textCode = textCode;
}
/// <summary>
/// Load and resolve Text according to Text-Code
/// </summary>
public override string DisplayName
{
get
{
// Load - Ooops: First global access
// --> How can it be injected with IoC?
TextbausteinRepository repo = Root.GetTextBausteinRepository();
var textItem = repo.GetText(textCode);
// Resolve - Ooops: Second global access
// --> How can it be injected with IoC?
TextResolver resolver = Root.GetTextResolver();
return resolver.resolve(textItem);
}
}
}
}
編集 2:そのコンテキストでは、レジストリ パターンなどのようなグローバル アクセスを回避する方法はないようです。UI はそこに必要なデータを登録し、属性はそこからアクセスします。に格納することを検討し始めましたThreadLocal<T>
が、ライフサイクル中にスレッドが交換される可能性があるため、これはあまり保存されないようです。HttpContext
したがって、レジストリ層に保存する方法はないようです。このテーマの詳細については、[Cup(Of T)][1] を参照してください。