在基类中创建递归 BuildUpAll 方法,而不填写所有依赖项属性
本文关键字:依赖 属性 创建 基类 递归 BuildUpAll 方法 | 更新日期: 2023-09-27 18:35:17
我正在使用Unity进行依赖注入,并且有一个相当大的类结构,每个级别都继承自基类。 由于各种原因,我正在使用 Unity 的依赖属性功能,并尝试创建一个方法,该方法将向下浏览结构并构建所有对象,而无需我再手动管理该代码。 到目前为止,我的基类看起来像这样
public class Base
{
[Dependency]
public IEventAggregator EventAggregator { get; set; }
[Dependency]
public ILoggerFacade LoggerFacade { get; set; }
public void BuildUpDependencies(IUnityContainer container)
{
var currentType = this.GetType();
container.BuildUp(this);
PropertyInfo[] properties = currentType.GetProperties();
foreach (var propertyInfo in properties)
{
var propertyType = propertyInfo.PropertyType;
// if property type is part go one level further down unless it has an attribute of GetValidationMessagesIgnore
if (TypeContainsBaseType(propertyType, typeof(Base)))
{
((Base)propertyInfo.GetValue(this)).BuildUpDependencies(container);
}
}
}
}
这对于构建所有类继承的 2 个依赖项非常有用,但这不会构建任何不在基类中的依赖项。 即
public class InterestingClass : Base
{
[Dependency]
public IRegionManager RegionManager { get; set; }
}
在这种情况下,InterestClass 将建立 2 个基本依赖项,但区域管理器将保持空。
我相信这是因为在 BuildUpDependencies 方法中,正在传递的"this"是 Base 类型而不是 InterestClass 类型,但我不确定如何确保将派生类类型传递给 BuildUp 方法。 有没有更简单的方法可以做到这一点? 如何将正确的类型传递给 BuildUp 以使其进入 BuildUp 所有正确的依赖项?
当所有其他方法都失败时,阅读文档通常会有所帮助。 如果您参考构建文档,则会发现 BuildUp 的重载会吸收类型和对象。 如果替换
...
var currentType = this.GetType();
container.BuildUp(this);
...
跟
...
var currentType = this.GetType();
container.BuildUp(currentType, this);
...
BuildUp 方法在派生类中构建所有内容,没有问题。