2017-05-28 175 views
1

Error: No parameterless constructor for AutoMapperConfigurationAutoMapper依賴注入參數

我使用的NuGet包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 
} 

如何使用帶參數的automapper DI?

+0

也許[這](https://stackoverflow.com/a/40275196/6583901)幫助 – NtFreX

+1

@ Dr.Fre不允許在automapper構造 –

+0

@MartinDawson是正確的參數。您只能注入自定義解析器和轉換器。 – efredin

回答

0

我不認爲您可以將DI參數添加到Profile s。部分邏輯背後的邏輯可能是這些只是一次實例化,因此通過AddTransient註冊的服務不會像預期的那樣運行。

一種選擇是將其注入到一個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

你可能想試試這個在您的Startup.cs,如果AddAutoMapper是你建立了一個擴展,然後添加代碼下面是你的擴展。

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'是問題中鏈接的NuGet包中的一種方法。 https://www.nuget.org/packages/AutoMapper.Extensions.Microsoft.DependencyInjection/ –

+0

我不確定,因爲我在我的所有.net核心項目上廣泛使用automapper,並且我沒有或沒有包含任何這樣的語句。 。爲了配置automapper,我所有/必須做的就是上面的那幾行,我說IMapper注入到我的類的構造函數中,然後使用它。 – Jaya

+0

我只是回答「如果AddAutoMapper是您構建的擴展」部分 - 我們知道在這種情況下它不是定製的。 –