2017-07-03 2 views
0

ASP.NET CoreAutoMapperプロファイルクラスのサービスレイヤーを使用する必要がありますが、コンストラクターにサービスを注入すると機能しません。たとえば、次のようにAutoMapperプロファイルクラスのインジェクションサービスの方法

public class UserProfile : Profile 
{ 
    private readonly IUserManager _userManager; 

    public UserProfile(IUserManager userManager) 
    { 
     _userManager = userManager; 

     CreateMap<User, UserViewModel>() 
      .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => $"{src.FirstName} {src.LastName}")); 
    } 
} 

そしてStartupクラスで:

それを行うにはどうすればよい
public class Startup 
{ 
    public IConfigurationRoot Configuration { set; get; } 

    public Startup(IHostingEnvironment env) 
    { 
     //some code 
    } 

    public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddSingleton<IActionContextAccessor, ActionContextAccessor>(); 
     services.AddMvc(); 
     services.AddScoped<IUsersPhotoService, UsersPhotoService>(); 
     services.AddAutoMapper(typeof(UserProfile)); 
    } 
} 

+1

コードを投稿してください。 – maxspan

+0

投稿が編集されました –

+1

あなたのDIセットアップコードも投稿できますか? – Ignas

答えて

6

問題を解決するには、IUserManagerをDIに配線して、UserProfileの依存関係が解決されていることを確認してください。

public void ConfigureServices(IServiceCollection services) 
{ 
    // ... 
    services.AddSingleton<IUserManager, UserManager>(); 
    services.AddSingleton(provider => new MapperConfiguration(cfg => 
    { 
     cfg.AddProfile(new UserProfile(provider.GetService<IUserManager>())); 
    }).CreateMapper()); 
} 

これは、おそらく、クラスごとに1つの責任を持ち、マッピングプロファイルに注入されたサービスを持たないようにしようとしています。マッピングの直前にオブジェクトを配置することができます。このようにして単体テストも容易になるでしょう。

+0

私の人生を保存してください!タイ – Ricardo

関連する問題