【问题标题】:Issue when trying to map interface to class type in Unity尝试将接口映射到 Unity 中的类类型时出现问题
【发布时间】:2013-12-19 23:55:01
【问题描述】:

问题背景:

我只是简单地设置一个 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:依赖项解析失败,类型 =“Adp.Tools.VersionControl.TfsVersionControl.ITfsVcPromotionManager”,名称 =“(无)”。 异常发生时:解决时。 异常是: InvalidOperationException - 当前类型 ABC.Tools.VersionControl.ITfsVcQaCheckoutWorker 是一个接口,无法构造。您是否缺少类型映射?

谁能告诉我为什么这不能从界面正确映射?

【问题讨论】:

  • 你试过注册构造函数参数吗?看起来 Unity 不知道如何构建构造函数所需的参数。

标签: c# unity-container


【解决方案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>();
}

【讨论】:

  • 非常感谢格兰特。通过检查我没有通过 Unity 中提升管理器的构造函数设置的 ITfsVcQaCheckoutWorker 对象,您让我走上了正确的道路。现已排序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-06
  • 1970-01-01
  • 2019-11-20
  • 2022-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多