我们使用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。
有人想到吗?
答案 0 :(得分:1)
答案包含在Haukinger发布的链接代码中:
object actual =
container.Resolve<IDatarecordSerializer>(
new ParameterOverride(
"type",
new InjectionParameter(typeof(string))
)
);
答案 1 :(得分:0)
事实上,Unity明确将Type
中的ParameterOverride
值视为字面值,而不是应该自行解析的类型。然后它尝试解析类型为string
的实例并且显然失败了。
ParameterOverride
将值存储在InjectionParameterValue
实例中,它将Type
解释为与其他类型不同。
我尝试使用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; }
}
不是火箭科学,而是简单,明显且易于调试