【发布时间】:2012-09-10 10:35:36
【问题描述】:
设置
- 解决方案使用棱镜
- VB 编写的模块项目
- 用 C# 编写的测试项目
在我的单元测试中,我模拟了模块使用的服务并传递它们,但是当模块尝试解析时,它会失败并出现以下异常
{"Resolution of the dependency failed, type = "UnderwritingWorkflow.Common.Services.IValidationService", name = "(none)".
Exception occurred while: while resolving.
Exception is: InvalidOperationException - The current type, UnderwritingWorkflow.Common.Services.IValidationService, is an interface and cannot be constructed. Are you missing a type mapping?
发生异常时,容器为:
正在解决 UnderwritingWorkflow.Common.Services.IValidationService,(无) "}
这里是使用 UnityContainer 注册对象的代码:
var validationService = new Mock<IValidationService>(MockBehavior.Strict);
validationService.Setup(x => x.Validate(Moq.It.IsAny<object>()))
.Returns(() => new ValidationResults());
Container.RegisterInstance(validationService.Object);
另外,如果尝试在注册后直接从 c# 解析 IServiceValidation(从构造函数中)似乎可以工作:
Container.Resolve<IValidationService>();
任何想法为什么会发生这种情况?
注意:我使用的是 Moq 模拟框架,它在运行时创建类,我想知道是不是 VB 的限制不允许我使用它?
【问题讨论】:
-
只是为了理解你的问题:模块是调用
Resolve还是注入IValidationService作为构造函数参数? -
我确实调用了resolve。并且从 c# 调用 resolve 有效,但从 VB 则不行
-
也许您有两个不同的容器,其中一个在您的测试中设置,但您的生产代码使用不同的容器。
-
不,这是我检查的第一件事
-
也许你的初始化代码相对于你的模块代码的运行顺序从 C# 到 VB 不同?顺便说一句:Abusing the container as a ServiceLocator should be avoided if possible.
标签: c# vb.net prism unity-container