c# - 需要 CastleWindsor 属性注入的属性
问题描述
尽管我更喜欢构造函数注入,但我希望团队中的开发人员能够使用属性注入,只要他们明确地将属性标记为可注入属性即可。根据这里的 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 的代码。如果我只能让它工作,我更喜欢使用上面的简单方法!
解决方案
推荐阅读
- python-3.x - 从银行读取 html 导出时出错。R$0,64 读作 64 类型 numpy.float64
- python - 如果for循环中的数字小于97,则加26
- javascript - 为响应组件分配样式,如 javascript element.style.width = width 语法
- mongodb - 将数据从无模式数据库迁移到关系数据库:MongoDB 到 Snowflake
- python - 从 Pygame 中的同一个 Sprite 类中拖动具有不同“update()”方法的多个精灵
- flutter - 颤振:重复 notifyListeners()
- php - 如何在 Stripe API PHP 中列出所有取消的订阅
- python - 基于布尔数组将列插入numpy数组
- java - 两个单独的方法中的 CompareTo 方法
- laravel - Laravel Horizon - 1 Worker 一次处理超过 1 个作业