Ошибка разрешения зависимости - Unity

Используя 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) Разрешение параметра «paymentService» конструктора ThirdPartyPaymentInvoker.ClearedPaymentService(Think.IncomeProtection.ThirdParty.Service.Contract.Outbound .IPaymentService paymentService, планировщик ThirdPartyPaymentInvoker.IScheduler) Разрешение Think.IncomeProtection.ThirdParty.Service.Contract.Outbound.IPaymentService, (нет)

Я понимаю, о чем говорит ошибка - конструктор ClearedPaymentService ожидает конкретный экземпляр IPaymentService, но по какой-то причине он не был разрешен...

Я новичок в Unity, поэтому предположим, что это что-то основное, чего я еще не понял!

Любая помощь приветствуется.

Спасибо, Алекс


person Al Hunter    schedule 24.06.2014    source источник


Ответы (1)


Ваши регистрации в контейнере предоставляют имя для каждой зарегистрированной службы. Так что в принципе нет default (безымянного) сервиса, который Unity может использовать в вашем сценарии.

Чтобы исправить это, просто удалите имена при регистрации файлов. Если, с другой стороны, вы хотите использовать конкретную именованную службу, то есть атрибут, который вы можете добавить к параметру вашего конструктора [NamedDependancy("Your name")]. Но по умолчанию вы не должны использовать эту функцию, без нее код проще.

person Rafal    schedule 24.06.2014
comment
Спасибо за ответ, я специально добавил именованные экземпляры, поскольку ResolveAll() не разрешается, если я этого не делаю. Перебор результатов не дал - person Al Hunter; 24.06.2014
comment
Да это правда. Но разрешите ли вы IPaymentService таким образом? если нет, то имя не нужно. Если это так, вы можете добавить вторую регистрацию без имени, чтобы заполнить регистрацию по умолчанию. - person Rafal; 24.06.2014
comment
Одно предупреждение о [NamedDependency]. Это связывает ваш код с Unity, что обычно плохо. А необходимость в [NamedDependency] указывает на нарушение LSP и двусмысленность в дизайне вашего применение. В вашем случае понятно, что вам просто нужна безымянная регистрация. В других случаях вам может не хватать абстракции, чтобы четко различать два типа (вместо использования [NamedDependency]). - person Steven; 24.06.2014
comment
Отличный материал! - Спасибо за помощь. Я добавил именованные версии в свои службы, но удалил имя из IPaymentService, что устранило проблему. - person Al Hunter; 24.06.2014