2010-09-17 99 views
1

我想有我自己的注入屬性,這樣我就不會將我的代碼耦合到特定的IOC框架。我有一個自定義注入屬性,我的代碼用來表示應該注入一個屬性。如何在使用StructureMap時爲屬性使用自定義注入屬性?

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一樣。

回答

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

這正是我之後。謝謝! – 2010-09-19 05:16:23

相關問題