1

私はasp.net core DIコンテナからautomapperを使って作成したオブジェクトのコンストラクタにサービスを注入する必要があるというシナリオに直面しています。.net core di containerからオートマッテで作成された新しいオブジェクトにサービスを渡す方法

これがベストプラクティスかどうかわかりませんが、私が達成しようとしていることを説明してください。

モデルパラメータを受け取るasp.netコアmvc​​コントローラがあります。そのモデルは、POCOだけです。そのモデルは、ビジネスロジック、データアクセスなどを含むViewModelクラスに変換する必要があります。私が問題を抱えている部分である注入されたサービスからいくつかの情報を得るには、コントローラーから最終ViewModelにサービスを注入する方法を理解できません。

この時点で私のコードはこのように見えます。

NewGameModel.cs

namespace MyProject.Shared.Models 
{ 
    public class NewGameModel 
    { 
     public List<PlayerModel> Players { get; set; } 

     public bool IsValid => Players.Any(); 

     public NewGameModel() 
     { 
      Players = new List<PlayerModel>(); 
     } 
    } 
} 

NewGameViewModel.cs

namespace MyProject.Core.ViewModels 
{ 
    public class NewGameViewModel 
    { 
     private Guid Token = Guid.NewGuid(); 
     private DateTime DateTimeStarted = DateTime.Now; 
     private readonly IConfiguration _configuration; 

     public List<PlayerModel> Players { get; set; } 

     public NewGameViewModel(IConfiguration config) 
     { 
      _configuration = config; 
     } 

     public string DoSomething() 
     { 
      //Do something using _configuration 

      //Business Logic, Data Access etc 
     } 
    } 
} 

MapperProfile.cs

namespace MyProject.Service 
{ 
    public class MapperProfile : Profile 
    { 
     public MapperProfile() 
     { 
      CreateMap<NewGameModel, NewGameViewModel>(); 
     } 
    } 
} 

ASP.NETコアプロジェクト - Startup.cs

namespace MyProject.Service 
{ 
    public class Startup 
    { 
     public IConfiguration Configuration { get; } 

     public Startup(IConfiguration configuration) 
     { 
      Configuration = configuration; 
     } 

     public void ConfigureServices(IServiceCollection services) 
     { 
      services.AddMvc(); 
      services.AddSingleton(Configuration); 

      var autoMapperConfig = new MapperConfiguration(cfg => 
      { 
       cfg.AddProfile(new MapperProfile()); 
      }); 

      var mapper = autoMapperConfig.CreateMapper(); 

      services.AddSingleton(mapper); 
     } 

     public void Configure(IApplicationBuilder app, IHostingEnvironment env) 
     { 
      if (env.IsDevelopment()) 
      { 
       app.UseDeveloperExceptionPage(); 
      } 

      app.UseMvc(); 
     } 
    } 
} 

ASP.NETコアプロジェクト - GameController.cs

namespace MyProject.Service.Controllers 
{ 
    [Route("api/[controller]")] 
    public class GameController : Controller 
    { 
     private readonly IConfiguration _configuration; 
     private readonly IMapper _mapper; 

     public GameController(IConfiguration config, IMapper mapper) 
     { 
      _configuration = config; 
      _mapper = mapper; 
     } 

     [HttpPost] 
     public IActionResult CreateNewGame([FromBody]NewGameModel model) 
     { 
      if (!model.IsValid) return BadRequest(); 

      //Throws error because no constructor parameter was passed  
      //How to pass the IConfiguration to the destination NewGameViewModel object? 

      var viewModel = _mapper.Map<NewGameModel, NewGameViewModel>(model); 

      var result = viewModel.DoSomething(); 

      return CreatedAtRoute("GetGame", new { token = result.GameToken }, result); 
     } 
    } 
} 

私が取るためにあなたの助け

+0

これをチェックしてください。 https://stackoverflow.com/questions/7192275/how-to-use-automapper-to-construct-object-without-default-constructor – Nkosi

+0

まだプロファイルに設定を取得する方法を理解しようとしていますが – Nkosi

+0

one https://stackoverflow.com/questions/2239143/automapper-how-to-map-to-constructor-parameters-instead-of-property-setters#2239647 – Nkosi

答えて

0

更新プロファイルに感謝します設定を注入依存関係として使用し、マッピングを作成するときはConstructUsingを使用します。

public class MapperProfile : Profile { 
    public MapperProfile(IConfiguration config) { 
     CreateMap<NewGameModel, NewGameViewModel>() 
      .ConstructUsing(_ => new NewGameViewModel(config)); 
    } 
} 
+0

提案したMapperProfileを変更して、サービスをコンストラクタパラメータに渡しますStartup.csでトリックをしました、ありがとう –

0

後で来るものについては、内部のプロファイルがあるため、上記の方法は好ましくありません。その代わり、AutoMapper.Extensions.Microsoft.DependencyInjectionパッケージを使用して、スタートアップの内側:

public class MapperProfile : Profile 
{ 
    public MapperProfile() 
    { 
     CreateMap<NewGameModel, NewGameViewModel>() 
      .ConstructUsingServiceLocator(); 
    } 
} 

あなたのコントローラは、その後に依存することができます:

services.AddAutoMapper(); 

次に、あなたのプロフィールには、ちょうどあなたがあなたの先のオブジェクトがコンテナで構築したいAutoMapperを伝えますIMapperとAutoMapperはDIコンテナを使用してビューモデルを構築し、ASP.NET Coreへの設定は1行になりますservices.AddAutoMapper();

関連する問題