使用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很新,所以假设它是我尚未理解的基本内容!
任何帮助表示感谢。
谢谢, 亚历
答案 0 :(得分:2)
您对容器的注册为每个已注册的服务提供了名称。所以基本上没有Unity可以在你的场景中使用的default
(未命名)服务。
要解决此问题,只需在注册时删除名称即可。另一方面,如果您希望使用特定的命名服务,则可以在构造函数[NamedDependancy("Your name")]
的参数上添加一个属性。但默认情况下,您不应该使用此功能,如果没有它,代码就会更简单。