2016-09-29 180 views
0

我们使用Unity依赖注入。我们有一个类需要传递给它的构造函数的类型。如何在使用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 - 无法构造字符串类型。您必须配置容器以提供此值。

在异常时,该容器是:

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

看来,统一想通过容器来解析类型,并传入一个类型的实例,但我确实需要类型。

想到任何人?

+0

你的意思'container.Resolve ...'?它似乎不工作的参数类型'类型',我尝试'字符串',它工作正常。可能是一个团结的错误。 – Haukinger

+0

尝试注册'myType'和'typeof(string)'作为一个实例不是一个类型 –

回答

1

答案载于从张贴Haukinger链接代码:

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

在此期间,通过改变依赖的类型,像这样隐藏团结Type

+0

它不起作用,同样的问题,Unity会尝试解决一个'字符串'不是一个typeof(字符串) – Dan

+0

这实际上工作,很好找! 'InjectionParameter'派生自'InjectionParameterValue',因此'InjectionParameterValue.ToParameter'可以直接使用它而不需要重新打包。 – Haukinger

0

实际上,Unity明确地将Type的值视为ParameterOverride而不是字面值,而是应该自己解析的类型。然后它试图解决类型为string的实例,并且显然失败。

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

见线InjectionParameterValue.cs

77ff我会尝试使用Unity创建一个问题,但我想这是一个多臭虫功能的...

class HiddenType 
{ 
    public Type Type 
    { 
     get; 
    } 

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

这就是要点:我需要的类型作为参数传递,因为构造函数要求,而不是由容器解决的实例如果你不能通过容器 –

+0

使用泛型,我想你可以将'Type'包装在一个虚拟类中,只是为了将它隐藏起来。相当丑陋,但工作。 – Haukinger

0

更简单的出路就是注册一家工厂:

给出:

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)); 

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

+0

谢谢,但构造函数是我的课程给定的。类型不是属性,而是参数。 –

相关问题