Проблема Autofac с подключением службы WCF - PullRequest
0 голосов
/ 29 ноября 2010

Извините, что беспокою сообщество своей маленькой проблемой, но я просто застрял!

Прежде чем мы углубимся в детали, вот моя настройка контейнера для сервисного модуля!

public class ServiceModule : Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            base.Load(builder);

            builder.Register(c => new ContextService(c.Resolve<IContextDataProvider>(),
                                                     c.ResolveNamed<IExceptionShield>("SRV_HOST_SHIELD"),
                                                     c.Resolve<IMonitoring>()))
                .As<IContextService>();

            builder.Register(c => new ExceptionShield(
                c.ResolveNamed<IShieldConfiguration>("SRV_SHIELD_CONFIG")))
                .Named<IExceptionShield>("SRV_HOST_SHIELD");

            builder.Register(c => new ServiceExceptionShieldConfiguration()).Named<IShieldConfiguration>("SRV_SHIELD_CONFIG");

            builder.RegisterType<ContextService>().Named<object>("Service.ContextService");
        }
    }

Проблема, которую я постоянно решаю, заключается в том, что второй параметр конструктора службы не может быть разрешен .

Я перепробовал все известные мне перестановки, включая простую инициализацию параметра без разрешения контейнера. Но все заканчивается одним и тем же исключением:

None of the constructors found with 'Public binding flags' on type 'Service.ContextService' can be invoked with the available services and parameters:
Cannot resolve parameter 'Common.ExceptionShield.IExceptionShield exceptionShield' of constructor 'Void .ctor(IContextDataProvider, Common.ExceptionShield.IExceptionShield, Common.Monitoring.IMonitoring)'.

Я, должно быть, здесь упускаю что-то решающее. Если вы видите мою ошибку, пожалуйста, сообщите мне:)

1 Ответ

2 голосов
/ 29 ноября 2010

Нашел проблему.Это маленькая вещь, которую я пропустил.

Autofac принимает только последнее определение типа.И потому что я повторно зарегистрировал тип, он принял последнее определение.

Это было только частью проблемы.Другая часть (генерирующая смешное сообщение об исключении) заключалась в том, что RegisterType () пытается автоматически связать тип.И поскольку все объекты могут быть найдены по их типу, за исключением исключительного щита с именем.

Рабочая конфигурация выглядит следующим образом:

public class ServiceModule : Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            base.Load(builder);

            builder.Register(c => new ContextService(c.Resolve<IContextDataProvider>(),
                                                     c.ResolveNamed<IExceptionShield>("SRV_HOST_SHIELD"),
                                                     c.Resolve<IMonitoring>()))
                .Named<object>("Service.ContextService");

            builder.Register(c => new ExceptionShield(
                c.ResolveNamed<IShieldConfiguration>("SRV_SHIELD_CONFIG")))
                .Named<IExceptionShield>("SRV_HOST_SHIELD");

            builder.Register(c => new ServiceExceptionShieldConfiguration()).Named<IShieldConfiguration>("SRV_SHIELD_CONFIG");
        }
    }

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

...