2016-04-21 7 views
3

Ich habe einen einfachen Injektor als meinen DI-Container konfiguriert. Ich habe this gefolgt. Ich vermute, mein Problem hat mit der Registrierung des Containers zu der SimpleInjectorServiceHostFactory zu tun. Ich benutze die Klassenbibliothek für die in der Webanwendung gehosteten Dienste. Ich habe keine .svc-Dateien, aber ich habe relative Adressen konfiguriert. Wo mache ich die Containerregistrierung?WCF: kein parameterloser Konstruktor für diese Objektabhängigkeitsinjektion definiert Einfacher Injektor

public static class ContainerBootstrap 
{ 
    public static Container Container { get; set; } 

    static ContainerBootstrap() 
    { 
     var container = new Container(); 

     container.Options.DefaultScopedLifestyle = new WcfOperationLifestyle(); 

     container.RegisterSingleton<ITypeAdapterFactory, AutomapperTypeAdapterFactory>(); 

     container.Register<IDepartmentService, DepartmentService>(); 

     var typeAdapterFactory = container.GetInstance<ITypeAdapterFactory>(); 
     TypeAdapterFactory.SetCurrent(typeAdapterFactory); 

     Container.Verify(); 

     Container = container; 
    } 
} 

AutomapperTypeAdapterFactory:

public class AutomapperTypeAdapterFactory : ITypeAdapterFactory 
{ 
    public AutomapperTypeAdapterFactory() 
    { 
     var profiles = AppDomain.CurrentDomain 
           .GetAssemblies() 
           .SelectMany(a => a.GetTypes()) 
           .Where(t => t.BaseType == typeof(Profile)); 

     var config = new MapperConfiguration(cfg => 
     { 
      foreach (var profile in profiles) 
      { 
       if (profile.FullName != "AutoMapper.SelfProfiler`2") 
        cfg.AddProfile(Activator.CreateInstance(profile) as Profile); 
      } 
     }); 

     ContainerBootstrap.Container.Register<MapperConfiguration>(() => config); 
     ContainerBootstrap.Container.Register<IMapper>(() => 
      ContainerBootstrap.Container.GetInstance<MapperConfiguration>() 
       .CreateMapper()); 
    } 

    public ITypeAdapter Create() => new AutomapperTypeAdapter(); 
} 

Individuelle Servicefactory

public class WcfServiceFactory : SimpleInjectorServiceHostFactory 
{ 
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
    { 
     return new SimpleInjectorServiceHost(ContainerBootstrap.Container, serviceType, 
      baseAddresses); 
    } 
} 

In WebHost web.config

<serviceActivations> 
    <add factory="Department.InstanceProviders.WcfServiceFactory" 
     service="Department.DepartmentService" relativeAddress="DepartmentService.svc" /> 
</serviceActivations> 
+0

Können Sie erklären, warum Sie eine benutzerdefinierte Fabrik haben? Warum nicht den Standard verwenden, den einfache Injektoren liefern? –

+0

es ist eine Design-Entscheidung, es sei denn, Sie wollen mir sagen, es ist der Verlauf der [email protected] – mkaris

+0

An dieser Stelle weiß ich nicht wirklich, ob es der Grund für die Ausnahme ist. Aber ich würde versuchen, mit dem Standard zu beginnen, um zu sehen, ob es ist. –

Antwort

4

Sie sollten eine Fabrik Eintrag unter dem serviceActivation Element hinzufügen in die Datei web.config. Dies stellt sicher, dass die SimpleInjectorServiceHostFactory verwendet wird, um den Dienst zu aktivieren.

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" 
    multipleSiteBindingsEnabled="true"> 
    <serviceActivations> 
     <add factory="SimpleInjector.Integration.Wcf.SimpleInjectorServiceHostFactory, 
SimpleInjector.Integration.Wcf" 
      relativeAddress="~/Service1.svc" 
      service="TestService.Service1" /> 
    </serviceActivations> 
</serviceHostingEnvironment> 
+0

Fügen Sie einen Factory-Eintrag hinzu, der dieses ' mkaris

+0

Ich habe bereits ein benutzerdefiniertes, wie in meiner web.config definiert. Was sehe ich nicht, vielleicht @ Steven – mkaris