10

[Inject]属性を使用せずにNinject2でプロパティインジェクションを使用する方法はありますか?これにより、それを使用して配線されるクラスにNinjectへの依存関係が作成され、IoCコンテナーへの不要な依存関係を避けたいので、コンストラクターインジェクションをより頻繁に使用することになります。

同じことがメソッドインジェクションにも当てはまると思います

4

3 に答える 3

9

私はルーベンのヒントに従い、これを達成する方法についての小さなブログ投稿を投稿しましたが、ここに簡単な答えがあります:

カスタム属性を作成します。

public class InjectHereAttribute : Attribute
{
}

ターゲットクラスは次のようになります。

public class Samurai
{
    [InjectHere]        
    public IWeapon Context { get; set; }
}

ここで、カスタム属性を使用するようにNinjectを構成する必要があります。これは、カスタム属性を認識するIInjectionHeuristicの実装を作成することで実行できます。

public class CustomInjectionHeuristic : NinjectComponent, IInjectionHeuristic, INinjectComponent, IDisposable
{
    public new bool ShouldInject(MemberInfo member)
    {
        return member.IsDefined(
          typeof(InjectHereAttribute),
          true);
    }
}

最後に、Componentsコレクションを使用してこの動作をNinjectカーネルに追加すると、既存のコンポーネント、つまりIInjectionHeuristicのデフォルトの実装に沿って実行されます。つまり、デフォルト属性またはカスタム属性のいずれかを使用できます。

// Add custom inject heuristic
kernel.Components.Add<IInjectionHeuristic, CustomInjectionHeuristic>();
于 2010-07-19T15:33:55.280 に答える
4

の代わりに使用できる作成時にカーネルに別の [attribute] タイプを渡すことができInjectAttributeますが、それでも中心的な OOTB を参照する必要があります。

ごく最近、属性なしで PI を実行することについて同様の質問がありました。カスタム スキャナーを配置するための OOTB (流暢な構成インターフェイスに直接のように) はありませんが、拡張ポイント (ビルド時に Ninject インターフェイスを実装するコンポーネントを追加します)与えられた属性を探すことがあなたが望むものではない場合、その側面がどのように機能するかを指示するカーネル) は、構成よりも規則に基づいてどこに注入するかを決定するためにそこにあります - スキャンを単にに基づくように修正することを止めるものは何もありません属性名 (したがって、必ずしも中央の場所に存在する必要はありません)。

一般に、コンストラクター注入は、これを含む多くの理由で有効であり、コード コンテナーにとらわれないようにすることが重要であることに注意してください (現在 1 つに満足している場合でも!)

于 2010-07-13T07:41:40.087 に答える
3

Heuristic クラスを使用してこれを達成できました。

public sealed class MyInjectionHeuristic : NinjectComponent, IInjectionHeuristic
{
        private static readonly IList<Type> 
            _propertyInjectible = 
                new List<Type>
                {
             typeof(IMyService),
                };

                    /// <summary>
      /// Returns a value indicating whether the specified member should be injected.
      /// </summary>
      /// <param name="member">The member in question.</param>
      /// <returns><c>True</c> if the member should be injected; otherwise <c>false</c>.</returns>
      public bool ShouldInject(MemberInfo member)
      {
       var info = member as PropertyInfo;

       if( member == null || info == null )
        return false;

       if (info.CanWrite)
        return _propertyInjectible.Contains(info.PropertyType);

       if( this.Settings == null )
        return false;

       var propList = member.GetCustomAttributes(this.Settings.InjectAttribute, true);

       return propList.Length > 0;
      }
}

カーネルを作成するとき:

var heuristics = _kernel.Components.Get<ISelector>().InjectionHeuristics;
   heuristics.Add(new MyInjectionHeuristic());

プロパティを介して他の型を注入する場合は、単純に IList に型を追加します。

于 2010-08-13T22:02:18.213 に答える