问题背景:
我只是设置一个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是一个接口,无法构造。你错过了类型映射吗?
有谁可以告诉我为什么这不会从界面正确映射?
答案 0 :(得分:1)
抱怨无法解决ITfsVcQaCheckoutWorker
。
你所做的唯一统一映射是ITfsVcPromotionManager
。解析接口时,它会创建一个TfsVcPromotionManager
实例,其构造函数接受另外两个接口:ITfsVcQaCheckinWorker
和ITfsVcQaCheckoutWorker
您尚未使用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>();
}