2

尽管我更喜欢构造函数注入,但我希望团队中的开发人员能够使用属性注入,只要他们明确地将属性标记为可注入属性即可。根据这里的 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 的代码。如果我只能让它工作,我更喜欢使用上面的简单方法!

4

0 回答 0