尽管我更喜欢构造函数注入,但我希望团队中的开发人员能够使用属性注入,只要他们明确地将属性标记为可注入属性即可。根据这里的 CastleWindsor 文档,这应该可以通过创建贡献者然后通过内核调用 AddContributor 来实现。我似乎无法让它发挥作用。所有公共属性(即使是那些没有属性的)都被注入。
当我在贡献者 ProcessModel 方法中设置断点时,它会将具有该属性的所有属性设置为强制 (IsOptional = false) 并跳过任何不具有该属性的属性。但尽管如此,没有该属性的属性仍然会被注入。我究竟做错了什么?
下面是我的代码:
贡献者
public class PropertyInjectionContributor : IContributeComponentModelConstruction
{
public void ProcessModel(IKernel kernel, ComponentModel model)
{
model.Properties
.Where(p => p.Property.IsDefined(typeof(InjectedAttribute)))
.All(p => p.Dependency.IsOptional = false);
}
}
属性
[AttributeUsage(AttributeTargets.Property)]
public class InjectedAttribute : Attribute { }
将贡献者添加到 Kernel.ComponentModelBuilder 并注册组件
public class Program
{
public static void Main(string[] args)
{
var container = new WindsorContainer();
container.Kernel.ComponentModelBuilder.AddContributor(new PropertyInjectionContributor());
container.Register(Component.For<IClass1>()
.ImplementedBy<Class1>()
.LifestyleTransient());
container.Register(Component.For<IClass2>()
.ImplementedBy<Class2>()
.LifestyleTransient());
var class1 = container.Resolve<IClass1>();
class1.DoSomething();
}
}
第一类
public class Class1 : IClass1
{
//[Injected]
public IClass2 Class2 { get; set; }
public void DoSomething()
{
Class2.DoSomething();
}
}
Class1 中的 Class2 属性被注入,即使它没有使用 Injected 属性进行修饰。
我目前的解决方法是删除 CastleWindsor 的 PropertiesDependenciesModelInspector 并将其替换为强制 IsOptional 为假的实现。它可以工作,但它重复了很多 CW 的代码。如果我只能让它工作,我更喜欢使用上面的简单方法!