Ninject 2.0: Инжекция Свойства без атрибута

Есть ли способ использовать Инжекцию Свойства в Ninject 2, не используя [Inject] атрибут? Это создает зависимость к Ninject в классе, который будет соединен проводом с помощью него, и я предпочитаю стараться не иметь ненужные зависимости к своему контейнеру МОК, вот почему я заканчиваю тем, что использовал Инжекцию Конструктора чаще.

Я предполагаю, что то же относится к Инжекции Метода

9
задан Ruben Bartelink 13 July 2010 в 07:38
поделиться

3 ответа

Я последовал совету Рубена и опубликовал небольшую запись в блоге о том, как этого добиться, но вот быстрый ответ:

Создайте настраиваемый атрибут:

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);
    }
}

И, наконец, добавьте это поведение в ядро ​​Ninject. используя коллекцию Components, он будет работать с существующими компонентами, а именно с реализацией IInjectionHeuristic по умолчанию, что означает, что можно использовать либо атрибут по умолчанию, либо настраиваемый атрибут.

// Add custom inject heuristic
kernel.Components.Add<IInjectionHeuristic, CustomInjectionHeuristic>();
8
ответ дан 4 December 2019 в 13:44
поделиться

Вы можете передать ядру другой тип [attribute] при создании, который можно использовать вместо InjectAttribute , но вам все равно придется ссылаться на что-то централизованно OOTB.

Совсем недавно был подобный вопрос о выполнении PI без атрибутов - нет OOTB (как непосредственно в интерфейсе свободной конфигурации), чтобы вставить пользовательский сканер, но есть точки расширяемости (вы добавляете компонент, который реализует интерфейс Ninject как вы создаете свое ядро, которое определяет, как этот аспект должен работать, если поиск данного атрибута - это не то, что вам нужно), чтобы определить, куда вводить на основе соглашения по конфигурации - ничто не мешает вам изменить сканирование, чтобы оно было основано только на имени атрибута (поэтому он не обязательно должен находиться в центре).

Обратите внимание, что в целом внедрение конструктора в любом случае хорошо по множеству причин, в том числе и по этой, и важно сохранять независимость от контейнера кода (даже если вы сейчас довольны одним из них!)

4
ответ дан 4 December 2019 в 13:44
поделиться

Мне удалось добиться этого с помощью эвристического класса:

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, если вы хотите внедрить другие типы через свойства.

3
ответ дан 4 December 2019 в 13:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: