2017-05-28 2 views
1

Error: No parameterless constructor for AutoMapperConfigurationAutoMapper Dependency Injection mit Parametern

ich das nuget Paket bin mit automapper DI

public class AutoMapperConfiguration : Profile 
{ 
    private readonly ICloudStorage _cloudStorage; 

    public AutoMapperConfiguration(ICloudStorage cloudStorage) 
    { 
     _cloudStorage = cloudStorage; 

     // Do mapping here 
    } 
} 

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddSingleton<ICloudStorage, AzureStorage>(); 
    services.AddAutoMapper(); // Errors here 
} 

Wie kann ich die AutoMapper DI mit Parametern verwenden?

+0

[diese] (https://stackoverflow.com/a/40275196/6583901) hilft – NtFreX

+1

@ Dr.Fre keine Parameter erlauben in AutoMapper Konstruktor –

+0

@MartinDawson richtig ist. Sie können nur in benutzerdefinierte Resolver und Konverter injizieren. – efredin

Antwort

0

Ich glaube nicht, dass Sie DI-Parameter zu Profile s hinzufügen können. Teil der Logik dahinter kann sein, dass diese nur einmal imstantiiert sind, so dass Dienste, die über AddTransient registriert wurden, sich nicht wie erwartet verhalten würden.

Eine Möglichkeit wäre, es zu injizieren in eine ITypeConverter:

public class AutoMapperConfiguration : Profile 
{ 
    public AutoMapperConfiguration() 
    { 
     CreateMap<SourceModel, DestinationModel>().ConvertUsing<ExampleConverter>(); 
    } 
} 

public class ExampleConverter : ITypeConverter<SourceModel, DestinationModel> 
{ 
    private readonly ICloudStorage _storage; 

    public ExampleCoverter(ICloudStorage storage) 
    { 
     // injected here 
     _storage = storage; 

    } 
    public DestinationModel Convert(SourceModel source, DestinationModel destination, ResolutionContext context) 
    { 
     // do conversion stuff 
     return new DestinationModel(); 
    } 
} 

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddSingleton<ICloudStorage, AzureStorage>(); 
    services.AddAutoMapper(); 
} 
1

Sie dies versuchen wollen möglicherweise auf Ihrem Startup.cs, wenn AddAutoMapper ist eine Erweiterung, die Sie gebaut, dann fügen Sie den Code unten zu deiner Erweiterung. vielleicht

public void ConfigureServices(IServiceCollection services) 
{ 
    var mapperConfiguration = new MapperConfiguration(mc => 
    { 
     IServiceProvider provider = services.BuildServiceProvider(); 
     mc.AddProfile(new AutoMapperConfiguration (provider.GetService<ICloudStorage>())); 
    }); 

    services.AddSingleton(mapperConfiguration.CreateMapper()); 
    } 
+0

'services.AddAutoMapper' ist eine Methode aus dem NuGet-Paket, das in der Frage verknüpft ist. https://www.nuget.org/packages/AutoMapper.Extensions.Microsoft.DependencyInjection/ –

+0

bin nicht sicher, weil ich Auto-Mapper extensiv für alle meine .net Kern-Projekte verwende, und ich solche Aussagen nicht oder nicht enthalten habe. Um den automatischen Mapper zu konfigurieren, habe ich nur die paar Zeilen oben gemacht, die besagten, dass ich IMapper in den Konstruktor meiner Klasse injiziere, nachdem ich ihn benutzt habe. – Jaya

+0

Ich antworte einfach auf den "wenn AddAutoMapper ist eine Erweiterung, die Sie gebaut" -Teil - wir wissen, dass es in diesem Fall keine benutzerdefinierte ist. –