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