2010-11-29 3 views
0

작은 문제로 커뮤니티에 귀찮게해서 죄송합니다.WCF 서비스의 자동 응답 문제 와이어

여기에 자세히 설명하기 전에 서비스 모듈에 대한 컨테이너 설정이 나와 있습니다! 내가 지속적으로 hawing입니다

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)'. 

여기서 중요한 무엇인가 놓치고 있어야합니다. 내 오류가 표시되면 알려주세요.

답변

2

발견. 간과 한 작은 일입니다.

Autofac은 유형의 마지막 정의 만 사용합니다. 그리고 유형을 다시 등록했기 때문에 마지막 정의를 취했습니다.

이것은 문제의 일부일뿐입니다. 다른 부분 (재미있는 예외 메시지를 생성하는 부분)은 RegisterType()이 유형을 autowire하려고한다는 사실이었습니다. 그리고 모든 객체는 예외 쉴드을 제외하고는 해당 유형으로 찾을 수 있기 때문에 이름이 지정되었습니다.

워킹 구성은 다음과 같습니다 : 좀 시간이 걸렸다

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"); 
     } 
    } 

쉬운 실수는 알아낼 수 있습니다. 희망이 밖으로 다른 잃어버린 영혼을 도와줍니다.