【问题标题】:Injecting property values with Unity - type conversion使用 Unity 类型转换注入属性值
【发布时间】:2011-04-26 22:17:38
【问题描述】:

我正在使用 Unity fluent API 在对象上注入属性值。我的程序从一个外部配置源,一个 xml 文件中获取属性的值。

我面临的问题是我试图设置的属性是 Int32 类型,但是从 xml 文件中读取的值最初被转换为字符串。我需要做什么才能让 Unity 进行必要的类型转换?如果我在 Unity 配置文件中配置容器,它可以工作,但是我不确定在代码中执行此操作时需要哪些进一步的步骤。

这是我的代码:

using (IUnityContainer taskContainer = new UnityContainer())
{
    taskContainer.RegisterType(typeof(ITask), jobType);

    // Configure properties
    foreach (PropInfo prop in jobConfig.Props)
    {
        // The next line raises an exception when setting an Int32 property
        taskContainer.RegisterType(jobType, new InjectionProperty(prop.Name, prop.Value));
    }

    ITask myTask = taskContainer.Resolve<ITask>();
}

词汇表: * prop.Value 是 Object 类型。 * 被注入的属性是 Int32 类型。 * jobType 是 Type 类型,之前已分配。 * PropInfo 是一个定制的帮助类,用于访问配置信息。 * jobInfo 是一个类似的帮助类的实例。

该代码可以很好地将属性值注入字符串属性,但是当我点击 Int32 属性时,我得到了异常:“DynamicTask 类型的属性 RetryCount 是 Int32 类型,并且不能注入 String 类型的值”。 [很明显,该属性的名称是 RetryCount,它位于一个名为 DynamicTask 的对象上]。

我猜我需要做一些前面的步骤来注册被注入的属性的类型,但我无法计算出语法,Unity 文档中有一些示例,但我不确定它们是否适用于我的情况。

如果有人能告诉我需要采取哪些之前的步骤,我将不胜感激。

非常感谢。

【问题讨论】:

  • 我发现这行得通,但我仍然想知道如何在 Unity 中使用 fluent API 执行此操作。 stepContainer.RegisterType(stepType, new InjectionProperty(prop.Name, Convert.ChangeType(prop.Value, stepType.GetProperty(prop.Name).PropertyType)));

标签: c# .net dependency-injection unity-container


【解决方案1】:

Unity 的 API 不能进行您要求的类型转换。我们使用 .NET TypeConverter 基础结构来处理来自 XML 端的转换,但 API 通常不需要它,因此我们没有对其进行任何特殊处理。

您提出的解决方案与其他解决方案一样好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    相关资源
    最近更新 更多