解决依赖关系失败 - Unity

时间:2014-06-24 11:17:11

标签: c# unity-container bootstrapper

使用Unity / Bootstrapper,我正在将我的基类 - ServiceBase注册到多个具体服务。

container.RegisterType<ServiceBase, ClearedPaymentService>("ClearedPaymentService");
container.RegisterType<ServiceBase, MissedPaymentService>("MissedPaymentService");

我也在这下面注册一个外部服务:

container.RegisterType<IPaymentService, PaymentServiceClient>("PaymentService");

外部服务在ClearedPaymentService和MissedPaymentService中使用,如下所示:

public partial class ClearedPaymentService : ServiceBase
{
    private readonly IPaymentService _paymentService;
    private readonly IScheduler _scheduler;
    private Timer _timer;

    public ClearedPaymentService(IPaymentService paymentService, IScheduler scheduler)
    {
        _paymentService = paymentService;
        _scheduler = scheduler;
    }

    ...etc
}

当我来使用我的2项服务时,我遇到了麻烦:

var container = (IUnityContainer)Bootstrapper.Container;
var services = container.ResolveAll<ServiceBase>();

if (Environment.UserInteractive)
{
    RunInteractive(services.ToArray());
}

代码在“services.ToArray()”上抛出异常:

  

依赖项的解析失败,type =“System.ServiceProcess.ServiceBase”,name =“ClearedPaymentService”。   在解决时发生异常:   例外情况是:InvalidOperationException - 当前类型Think.IncomeProtection.ThirdParty.Service.Contract.Outbound.IPaymentService是一个接口,无法构造。你错过了类型映射吗?   在例外时,容器是:   解析ThirdPartyPaymentInvoker.ClearedPaymentService,ClearedPaymentService(从System.ServiceProcess.ServiceBase映射,ClearedPaymentService)   解析构造函数ThirdPartyPaymentInvoker.ClearedPaymentService的参数“paymentService”(Think.IncomeProtection.ThirdParty.Service.Contract.Outbound.IPaymentService paymentService,ThirdPartyPaymentInvoker.IScheduler scheduler)   解决Think.IncomeProtection.ThirdParty.Service.Contract.Outbound.IPaymentService,(无)

我理解错误的含义 - ClearedPaymentService的构造函数正在期待IPaymentService的具体实例,但由于某种原因它尚未得到解决......

我对Unity很新,所以假设它是我尚未理解的基本内容!

任何帮助表示感谢。

谢谢, 亚历

1 个答案:

答案 0 :(得分:2)

您对容器的注册为每个已注册的服务提供了名称。所以基本上没有Unity可以在你的场景中使用的default(未命名)服务。

要解决此问题,只需在注册时删除名称即可。另一方面,如果您希望使用特定的命名服务,则可以在构造函数[NamedDependancy("Your name")]的参数上添加一个属性。但默认情况下,您不应该使用此功能,如果没有它,代码就会更简单。