开发者

How to use custom injection attribute for properties when using StructureMap?

I would like to have my own injection attribute so that I am not coupling my code to a particular IOC framework. I have a custom injection attribute that my code uses to denote that a property should be injected.

public class CustomIn开发者_StackOverflow社区jectAttribute : Attribute {}

Fictitious example below...

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

   ...
}

In Ninject, you can setup an injection Heuristic to find that attribute, and inject like;

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

and then register the heuristic with the kernel.

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

How would I go about achieving this with StructureMap. I know StructureMap has its own SetterProperties and attributes, but I'm looking for a way to decouple from that as you can with Ninject in the above example.


Use the SetAllProperties() method in your ObjectFactory or Container configuration. For example:

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

This makes use of a handy extension method (that should be in the BCL):

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜