1

자동 완성기를 사용하여 생성 된 객체의 생성자에 asp.net 코어 DI 컨테이너의 서비스를 주입해야하는 시나리오에 직면하고 있습니다. ..net core di 컨테이너에서 오토메이터로 생성 된 새로운 객체에 서비스를 전달하는 방법

이것이 최선의 방법인지는 모르겠지만 내가 성취하려는 것을 설명해 드리겠습니다.

모델 매개 변수, 단지 POCO를받는 asp.net 코어 mvc 컨트롤러가 있는데, 그 모델은 내가 원하는 클래스 개체에서 비즈니스 로직, 데이터 액세스 등을 포함하는 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을 사용하십시오.

+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 코어에 대한 구성은 services.AddAutoMapper();