尝试将接口映射到Unity中的类类型时出现问题

时间:2013-12-19 23:55:02

标签: c# unity-container

问题背景:

我只是设置一个Unity容器对象,注册所选接口的类型和继承它的类,然后尝试返回它的实现。

代码:

统一:

namespace ABC.Tools.VersionControl
{
internal class Unity
{
    internal static ITfsVcPromotionManager CreateUnityObjects()
    {
        var unityContainer = new UnityContainer();

        unityContainer.RegisterType<ITfsVcPromotionManager, TfsVcPromotionManager>();

        //****ERROR*****
        return unityContainer.Resolve<ITfsVcPromotionManager>();
    }
  }
}

界面 - ITfsVcPromotionManager:

namespace ABC.Tools.VersionControl.TfsVersionControl
{ 
    interface ITfsVcPromotionManager
    {
        void CheckoutTfsItem(IVersionControlItem tfsItem);

        int CheckinTfsItem(IVersionControlItem tfsItem);
    }
}

继承上述接口的类 - TfsVcPromotionManager

namespace ABC.Tools.VersionControl.TfsVersionControl
{
internal class TfsVcPromotionManager:ITfsVcPromotionManager
{
    private ITfsVcQaCheckoutWorker _checkoutWorker;

    private ITfsVcQaCheckinWorker _checkInWorker;

    private VersionControlServer _tfsServer;

    private TfsVcCheckoutItem _checkoutItem = new TfsVcCheckoutItem();

    public TfsVcPromotionManager(/*IVersionControlItem tfsItem*/ ITfsVcQaCheckoutWorker checkOutWorker, ITfsVcQaCheckinWorker checkInWorker, VersionControlServer tfsServer)
    {
        if (checkOutWorker == null || tfsServer == null)
        {
            throw new System.ArgumentException("tfsItem or tfsServer objects cannot be null");
        }

        _checkoutWorker = checkOutWorker;

        _checkInWorker = checkInWorker;

        _tfsServer = tfsServer;
    }

    public void CheckoutTfsItem(IVersionControlItem tfsItem)
    {
        if (tfsItem == null)
        {
            throw new System.ArgumentException("TfsItem cannot be null.");
        }

        _checkoutWorker.CheckoutTfsQaItem(_tfsServer);
    }

    public int CheckinTfsItem(IVersionControlItem tfsItem)
    {
        if (tfsItem == null)
        {
            throw new System.ArgumentException("tfsItem cannot be null.");
        }

        return _checkInWorker.CheckinTfsQaItem(tfsItem);
    }
}

错误消息:

结果讯息: 测试方法ABCTestProject.TFStests.Check_Interface_CheckOut_Method抛出异常: Microsoft.Practices.Unity.ResolutionFailedException:依赖项的解析失败,type =“Adp.Tools.VersionControl.TfsVersionControl.ITfsVcPromotionManager”,name =“(none)”。 在解决时发生异常: 异常是:InvalidOperationException - 当前类型ABC.Tools.VersionControl.ITfsVcQaCheckoutWorker是一个接口,无法构造。你错过了类型映射吗?

有谁可以告诉我为什么这不会从界面正确映射?

1 个答案:

答案 0 :(得分:1)

抱怨无法解决ITfsVcQaCheckoutWorker

你所做的唯一统一映射是ITfsVcPromotionManager。解析接口时,它会创建一个TfsVcPromotionManager实例,其构造函数接受另外两个接口:ITfsVcQaCheckinWorkerITfsVcQaCheckoutWorker

您尚未使用unity(也称为类型映射)注册这些接口,因此它不知道如何为它们构造具体类。

我不知道你的其他课程的名称是什么,但你应该能够在另一个课程之后立即注册:

internal static ITfsVcPromotionManager CreateUnityObjects()
{
    var unityContainer = new UnityContainer();

    unityContainer.RegisterType<ITfsVcPromotionManager, TfsVcPromotionManager>();
    unityContainer.RegisterType<ITfsVcQaCheckinWorker, TfsVcQaCheckinWorker>();
    unityContainer.RegisterType<ITfsVcQaCheckoutWorker, TfsVcQaCheckoutWorker>();

    return unityContainer.Resolve<ITfsVcPromotionManager>();
}