构造函数参数不存在的例外情况

时间:2014-01-03 17:13:49

标签: c# exception constructor unity-container integration-testing

我试图通过使用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班的建设者。请注意,它明确地接受了基于接口ITfsVcQaCheckoutworkerITfsVcCheckinWorker的实例。

 private ITfsVcQaCheckoutWorker _checkOutWorker;

    private ITfsVcQaCheckinWorker _checkInWorker;

    public TfsVcPromotionManager(ITfsVcQaCheckoutWorker checkOutWorker,
                                 ITfsVcQaCheckinWorker checkInWorker)
    {
        if (checkOutWorker == null || checkInWorker == null)
        {
            throw new NullReferenceException();
        }

        _checkOutWorker = checkOutWorker;
        _checkInWorker = checkInWorker;
    }

任何人都可以告诉我我做错了什么。

2 个答案:

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