在基类中创建递归 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 所有正确的依赖项?

在基类中创建递归 BuildUpAll 方法,而不填写所有依赖项属性

当所有其他方法都失败时,阅读文档通常会有所帮助。 如果您参考构建文档,则会发现 BuildUp 的重载会吸收类型和对象。 如果替换

...
var currentType = this.GetType();
container.BuildUp(this);
...

...
var currentType = this.GetType();
container.BuildUp(currentType, this);
...

BuildUp 方法在派生类中构建所有内容,没有问题。