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

本文关键字:类型 参数传递 构造函数 注入 Unity 依赖 | 更新日期: 2023-09-27 18:09:40

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

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

在集装箱助推器中,我们注册我们的类型:

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。必须配置容器才能提供此值。

发生异常时,容器为:

解析测试,(none((从Belastingdienst.Omvormers.Mapper.Test映射,(none((正在解析构造函数Test(System.Type myType(的参数"myType"正在解析System.String,(无(--->System.InvalidOperationException:无法构造类型String。必须配置容器才能提供此值。

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

有人想吗?

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

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

object actual = 
    container.Resolve<IDatarecordSerializer>(
        new ParameterOverride(
            "type", 
             new InjectionParameter(typeof(string))
        )
    );
事实上,Unity显式地将ParameterOverride中的Type值视为类型,而不是文字值。然后它尝试解析一个类型为string的实例,但显然失败了。

ParameterOverride将该值存储在InjectionParameterValue实例中,从而解释不同于其他类型的Type

参见InjectionParameterValue.cs 中的第77ff行

我会尝试用Unity创建一个问题,但我想这更多的是一个功能而不是一个bug。。。

同时,通过将依赖项的类型更改为以下内容来向Unity隐藏Type

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

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

给定:

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

Fty:

internal class TypedFactory : ITypedFactory
{
    public ITyped Create(Type type)
    {
        return new Typed(type);
    }
}
internal interface ITypedFactory
{
    ITyped Create(Type type);
}

container.RegisterType<ITypedFactory, TypedFactory>();
Assert.AreEqual(
    container.Resolve<ITypedFactory>().Create(typeof(string)).Type,
     typeof(string));

不是火箭科学,但它简单、明显且更容易调试