【问题标题】:Exception that a constructor parameter doesn't exist when it does构造函数参数不存在的异常
【发布时间】:2024-05-15 16:10:02
【问题描述】:

我正在尝试通过使用 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;
    }

谁能告诉我我做错了什么。

【问题讨论】:

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


    【解决方案1】:

    它说它找不到“带参数的构造函数(TfsVcQaCheckoutWorker)”,这确实是一个真实的说法。没有构造函数只接受一个参数。我对 Unity 不是很熟悉,但我敢打赌你的问题可以通过改变这个来解决:

    container.RegisterType<ITfsVcPromotionManager, TfsVcPromotionManager>(
        new InjectionConstructor(test2),
        new InjectionConstructor(test1))
    

    到这里:

    container.RegisterType<ITfsVcPromotionManager, TfsVcPromotionManager>(
        new InjectionConstructor(test2, test1))
    

    有关 InjectionConstructor 的 constructor,请参阅 MSDN 参考。

    【讨论】:

    • 非常感谢杰夫布里奇曼。那工作得很好。我有点不好意思错过了。
    【解决方案2】:

    我相信您应该以另一种方式注册具有多个参数的容器。你试过吗?

    container.RegisterType<ITfsVcPromotionManager, TfsVcPromotionManager>(
        new InjectionConstructor(test2, test1)
    );
    

    【讨论】: