Как использовать пользовательский атрибут внедрения для свойств при использовании StructureMap? - PullRequest
1 голос
/ 17 сентября 2010

Я хотел бы иметь свой собственный атрибут внедрения, чтобы я не связывал свой код с конкретной платформой IOC. У меня есть собственный атрибут внедрения, который мой код использует для обозначения того, что свойство должно быть введено.

public class CustomInjectAttribute : Attribute {}

Фиктивный пример ниже ...

public class Robot : IRobot
{
   [CustomInject]
   public ILaser Zap { get; set; }

   ...
}

В Ninject вы можете настроить эвристику инъекций, чтобы найти этот атрибут, и вводить как;

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

и затем зарегистрировать эвристику в ядре.

Kernel.Components.Get<ISelector>().InjectionHeuristics.Add(new NinjectInjectionHeuristic());

Как мне добиться этого с помощью StructureMap. Я знаю, что StructureMap имеет свои собственные SetterProperties и атрибуты, но я ищу способ отделить его от Ninject в приведенном выше примере, как вы можете.

1 Ответ

4 голосов
/ 17 сентября 2010

Используйте метод SetAllProperties () в вашей конфигурации ObjectFactory или Container. Например:

new Container(x =>
{
    x.SetAllProperties(by =>
    {
        by.Matching(prop => prop.HasAttribute<CustomInjectAttribute>());
    });
});

Для этого используется удобный метод расширения (который должен быть в BCL):

public static bool HasAttribute<T>(this ICustomAttributeProvider provider) where T : Attribute
{
    return provider.GetCustomAttributes(typeof (T), true).Any();
}
...