使用StructureMap时如何使用属性的自定义注入属性?

时间:2010-09-17 09:03:07

标签: dependency-injection structuremap ninject

我想拥有自己的注入属性,这样我就不会将我的代码耦合到特定的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 个答案:

答案 0 :(得分:4)

在ObjectFactory或Container配置中使用SetAllProperties()方法。例如:

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