2010-11-29 4 views
0

Es tut mir leid, die Gemeinde mit meinem kleinen Problem zu stören, aber ich bin nur stecken!Autofac Problem mit WCF-Service-Kabel

Bevor wir ins Detail gehen, hier ist meine Container-Setup für das Servicemodul!

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

Das Problem, das ich konsequent hawing bin ist, dass der zweite Parameter des Dienstes Konstruktor nicht aufgelöst werden kann.

Ich habe versucht, alle, mir bekannten, Permutationen einschließlich einfach nur den Parameter ohne Container Auflösung zu initialisieren. Aber alles endet in der gleichen Ausnahme:

Ich muss hier etwas Entscheidendes fehlen. Wenn Sie meinen Fehler sehen, dann bitte sagen Sie mir :)

Antwort

2

Das Problem gefunden. Es ist eine kleine Sache, die ich übersehen habe.

Autofac nimmt nur die letzte Definition eines Typs. Und weil ich den Typ neu registriert habe, hat er die letzte Definition genommen.

Dies war nur ein Teil des Problems. Der andere Teil (derjenige, der die lustige Ausnahmebedingungsnachricht erzeugt) war die Tatsache, dass RegisterType() versucht, den Typ automatisch zu senden. Und weil alle Objekte nach ihrem Typ gefunden werden konnten, außer dem Ausnahme-Schild, das benannt wurde.

Die Arbeitskonfiguration sieht wie folgt aus:

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

Einfache Fehler, der mir einige Stunden in Anspruch nahm, um herauszufinden. Hoffe, das hilft anderen verlorenen Seelen da draußen.