使用Unity依赖注入时如何将类型作为参数传递给构造函数

时间:2016-09-29 10:54:37

标签: c# unity-container

我们使用Unity依赖注入。我们有一个类需要传递给它的构造函数。

public interface ITest
{
}

public class Test : ITest
{
    public Test(Type myType)
    {

    }
}

在容器boostrapper中,我们注册了我们的类型:

public static IUnityContainer Start()
{
    IUnityContainer container = UnityInversionOfControlContainer.RegisterContainer();

    container.RegisterType<ITest, Test>();

    return container;
}
我们这样解决:

object actual = container.Resolve<ITest>(new ParameterOverride("myType", typeof(string)));

这会产生以下错误:

Microsoft.Practices.Unity.ResolutionFailedException:依赖项的解析失败,type =“ITest”,name =“(none)”。 在解决时发生异常: 异常是:InvalidOperationException - 无法构造String类型。您必须配置容器以提供此值。

在例外时,容器是:

解析测试,(无)(从Belastingdienst.Omvormers.Mapper.ITest映射,(无))   解析构造函数Test的参数“myType”(System.Type myType)     解析System.String,(无)  ---&GT; System.InvalidOperationException:无法构造String类型。您必须配置容器以提供此值。

Unity似乎希望通过容器解析类型,并传入该类型的实例,但我确实需要Type。

有人想到吗?

3 个答案:

答案 0 :(得分:1)

答案包含在Haukinger发布的链接代码中:

object actual = 
    container.Resolve<IDatarecordSerializer>(
        new ParameterOverride(
            "type", 
             new InjectionParameter(typeof(string))
        )
    );

答案 1 :(得分:0)

事实上,Unity明确将Type中的ParameterOverride值视为字面值,而不是应该自行解析的类型。然后它尝试解析类型为string的实例并且显然失败了。

ParameterOverride将值存储在InjectionParameterValue实例中,它将Type解释为与其他类型不同。

InjectionParameterValue.cs

中的第77ff行

我尝试使用Unity创建一个问题,但我想它更像是一个功能而不是一个错误...

在此期间,通过将依赖项的类型更改为以下内容,隐藏Unity中的Type

class HiddenType
{
    public Type Type
    {
        get;
    }

    public HiddenType( Type type )
    {
        Type = type;
    }
}

答案 2 :(得分:0)

更简单的方法是注册工厂:

下式给出:

final

FTY:

internal interface ITyped
{
    Type Type { get; }
}

internal class Typed : ITyped
{
    public Typed(Type type)
    {
        Type = type;
    }

    public Type Type { get; }
}

不是火箭科学,而是简单,明显且易于调试