0

次の基本的なプロジェクト設定を想定しましょう。

- Core
-- Attributes
--- CustomDisplayNameAttribute : DisplayNameAttribute
- UI

UI は MVC Web インターフェイスを表し、コアはすべてのドメイン ビジネス オブジェクトを実装しますCustomDisplayNameAttribute。この属性には、言語リゾルバなどの追加の依存関係が含まれます。たとえば、フォールバック オーダーを処理します。Hibernate セッションは、別の依存関係になる可能性があります。

以前のプロジェクトでは、これらの属性はリゾルバーを取得するためにグローバル リクエストを実行していました。これは IMO の醜さであり、別の方法で処理する必要があります。さらに、コアはなしのままにしておく必要があります。HttpContextリクエストごとに言語リゾルバーが必要なため、HttpContextItems コレクションになる可能性があります。

今、私はNinjectの初心者であり、そのような依存関係をCustomDisplayNameAttribute?

言葉にすると、次のようになります。

  • 属性が作成されている場合は、追加の言語リゾルバー プロパティにHttpContextItems コレクションの言語リゾルバーを設定します。
  • ない場合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] を参照してください。

4

1 に答える 1

0

データ属性はフィルターのように実行時にディスパッチされないため、これは可能ではないと思います。そのため、作成を傍受して探しているものを注入する場所はありません。

于 2012-08-08T16:25:09.527 に答える