我试图通过使用Unity将基于接口的两个对象注入到类构造函数中。
我在单元测试时遇到以下错误:
结果讯息:
测试方法TestProject.TFStests.Check_Interface_CheckOut_Method抛出异常: System.InvalidOperationException:类型Adp.Tools.VersionControl.TfsVersionControl.TfsVcPromotionManager没有带参数的构造函数(TfsVcQaCheckoutWorker)。
以下代码是我的Unity类,用于注册和解析TfsVCPromotionManager
对象:
public class UnityClass
{
public static ITfsVcPromotionManager returnNewPromotionManager(
VersionControlServer tfServer)
{
var container = new UnityContainer();
ITfsVcQaCheckinWorker test1 = CreateUnityCheckInWorker();
ITfsVcQaCheckoutWorker test2 = CreateUnityCheckOutWorker(tfServer);
container.RegisterType<ITfsVcPromotionManager, TfsVcPromotionManager>(
new InjectionConstructor(test2), new InjectionConstructor(test1));
return container.Resolve<TfsVcPromotionManager>();
}
private static ITfsVcQaCheckinWorker CreateUnityCheckInWorker()
{
var container = new UnityContainer();
container.RegisterType<ITfsVcQaCheckinWorker, ITfsVcQaCheckinWorker>();
return container.Resolve<TfsVcQaCheckinWorker>();
}
private static ITfsVcQaCheckoutWorker CreateUnityCheckOutWorker(
VersionControlServer passedServer)
{
var container = new UnityContainer();
container.RegisterType<ITfsVcQaCheckoutWorker, TfsVcQaCheckoutWorker>(
new InjectionConstructor(passedServer));
return container.Resolve<TfsVcQaCheckoutWorker>();
}
}
这是TfsVcPromotionManager
班的建设者。请注意,它明确地接受了基于接口ITfsVcQaCheckoutworker
和ITfsVcCheckinWorker
的实例。
private ITfsVcQaCheckoutWorker _checkOutWorker;
private ITfsVcQaCheckinWorker _checkInWorker;
public TfsVcPromotionManager(ITfsVcQaCheckoutWorker checkOutWorker,
ITfsVcQaCheckinWorker checkInWorker)
{
if (checkOutWorker == null || checkInWorker == null)
{
throw new NullReferenceException();
}
_checkOutWorker = checkOutWorker;
_checkInWorker = checkInWorker;
}
任何人都可以告诉我我做错了什么。
答案 0 :(得分:4)
它说它找不到“带参数的构造函数(TfsVcQaCheckoutWorker)”,这确实是一个真实的陈述。没有构造函数只接受一个参数。我对Unity并不熟悉,但我打赌你的问题可以通过改变它来解决:
container.RegisterType<ITfsVcPromotionManager, TfsVcPromotionManager>(
new InjectionConstructor(test2),
new InjectionConstructor(test1))
对此:
container.RegisterType<ITfsVcPromotionManager, TfsVcPromotionManager>(
new InjectionConstructor(test2, test1))
请参阅InjectionConstructor的constructor的MSDN参考。
答案 1 :(得分:4)
我相信你应该用另一种方式注册带有几个参数的容器。你试过这个吗?
container.RegisterType<ITfsVcPromotionManager, TfsVcPromotionManager>(
new InjectionConstructor(test2, test1)
);