Visual Studio 2019를 사용하여 MVC 5 프로젝트에 AutoFac 5 및 AutoMapper 10을 통합하는 방법
19216 단어 autofacaspnetmvcautomapperaspnet
개발자 여러분 안녕하세요!
오늘 우리는 Visual Studio 2019를 사용하여 AutoFac 및 AutoMapper를 ASP.NET MVC 5 프로젝트에 통합할 것입니다.
하지만 먼저 이러한 프레임워크가 무엇인지 알려주세요.
AutoFac - IoC 또는 Inversion of Controls에 주로 사용되는 프레임워크입니다. 이 시스템 설계는 일반적으로 종속성 주입이라고도 합니다. DI를 사용하면 느슨하게 결합되고 테스트 및 유지 관리가 가능한 애플리케이션을 구축할 수 있습니다. 소프트웨어 구성 요소 간의 종속성을 줄이고 대부분의 기능을 재사용할 수 있도록 유지합니다. DI에 대해 자세히 알아보려면 Mark Seemann이 작성한 .NET의 종속성 주입을 적극 권장합니다. 이 책에서는 다양한 .NET 솔루션이 포함된 모든 유형의 DI에 대해 설명했습니다.
AutoMapper - 단순히 다른 개체를 유사한 개체로 변환하는 라이브러리입니다. 공유할 수 있는 한 가지 주요 예는 애플리케이션에서 사용하려는 다른 ViewModel 클래스로 Model 클래스를 변환하려는 경우입니다. 우리는 일반적으로 필요하지 않은 속성을 숨기고, 기본 클래스를 수정할 필요가 없는 추가 속성을 추가하고, 기타 유사한 요구 사항을 추가하기 위해 이 작업을 수행합니다.
이제 이 두 가지를 모두 구현해 보겠습니다. AutoFac을 사용하여 컨트롤러에 AutoMapper를 주입해야 합니다!
먼저 Visual Studio 2019를 사용하여 ASP.NET MVC 5 프로젝트를 만들고 NuGet에서 다음 패키지를 추가해 보겠습니다.
오토팩 5
오토매퍼 10
다음으로 AutoFac에서 새 모듈을 추가해 보겠습니다. 여기서 우리는 AutoFac 어셈블리의 Module 클래스에서 상속되는 새 클래스를 추가하고 있습니다.
using Autofac;
using AutoMapper;
public class AutoFacModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.Register(context => new MapperConfiguration(cfg =>
{
//Register Mapper Profile
cfg.AddProfile<AutoMapperProfile>();
}
)).AsSelf().SingleInstance();
builder.Register(c =>
{
//This resolves a new context that can be used later.
var context = c.Resolve<IComponentContext>();
var config = context.Resolve<MapperConfiguration>();
return config.CreateMapper(context.Resolve);
})
.As<IMapper>()
.InstancePerLifetimeScope();
}
}
다음으로 AutoMapper의 프로필을 상속받은 AutoMapperProfile을 추가해 보겠습니다. (Person과 PersonViewModel의 정의는 잠시 후에 논의될 것입니다)
using AutoFacAndAutoMapperMVC.Models;
using AutoMapper;
namespace AutoFacAndAutoMapperMVC.Infrastructure
{
public class AutoMapperProfile : Profile
{
public AutoMapperProfile()
{
CreateMap<Person, PersonViewModel>();
CreateMap<PersonViewModel, Person>();
}
}
}
AutoMapper 등록
모든 구성이 끝나면 MVC 솔루션의 Global.asax 파일에 해당 구성을 등록해야 합니다.
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
var builder = new ContainerBuilder();
// Register your MVC controllers. (MvcApplication is the name of
// the class in Global.asax.)
builder.RegisterControllers(typeof(MvcApplication).Assembly);
//Register AutoMapper here using AutoFacModule class (Both methods works)
//builder.RegisterModule(new AutoMapperModule());
builder.RegisterModule<AutoFacModule>();
// Set the dependency resolver to be Autofac.
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
그런 다음 데모용으로 Person 및 PersonViewModel 클래스인 두 개의 클래스를 만들어야 합니다. 다음은 이 두 클래스의 정의입니다.
public class PersonViewModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Country { get; set; }
public string MaritalStatus { get; set; }
public string HighestEducation { get; set; }
}
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime? DateOfBirth { get; set; }
public string PhoneNumber { get; set; }
public string Address { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Country { get; set; }
public string MaritalStatus { get; set; }
public string HighestEducation { get; set; }
}
AutoMapper의 목적은 무엇입니까? 데이터베이스 리포지토리 또는 메모리 데이터의 결과 집합에서 Person 목록을 가져오고 있다고 가정해 보겠습니다. 그리고 그 결과를 보기 페이지로 보내기 위해 프로젝션하고 싶지만 모델은 다르지만 속성은 동일합니까? 일부 속성을 숨기고 싶기 때문에 이 작업을 수행할 수 있습니다. 프로젝션을 통해 이 작업을 수행할 수 있습니다.
//new List<Person>() only assumes that this results came from a results set of Person objects
var model = new List<Person>().Select(x => new PersonViewModel()
{
FirstName = x.FirstName,
LastName = x.LastName,
Country = x.Country,
HighestEducation = x.HighestEducation,
MaritalStatus = x.MaritalStatus
});
각 속성을 매핑하는 것은 쉬울 수 있지만 각 구현에서 만들 모든 프로젝션에 대한 긴 속성 목록을 볼 때까지는 그다지 생산적이지 않습니다.
AutoMapper를 사용하면 하나의 코드로만 이 작업을 수행할 수 있습니다.
//This entity object can come from Database or any related source
var person = new Person()
{
Id = 1,
FirstName = "Cecilia",
LastName = "Chapman",
Address = "32 West Court Street",
City = "Dallas",
State = "GA",
Country = "USA",
DateOfBirth = new DateTime(1981, 1, 5),
HighestEducation = "College Graduate",
MaritalStatus = "Married",
PhoneNumber = "+1-541-754-3010"
};
var model = _mapper.Map<PersonViewModel>(person);
긴 프로젝션 목록을 수행하지 않고도 동일한 속성을 가진 두 클래스를 쉽게 매핑할 수 있습니다.
다음은 디버그 모드 중 실제 매핑의 스크린샷입니다.
마지막으로 종속성 주입을 사용하기 위해 Controller 생성자에 IMapper 인터페이스를 직접 주입합니다. 따라서 HomeController에 대한 모든 요청은 요청이 완료될 때까지 IMapper의 새 인스턴스를 주입합니다.
내 Github 리포지토리에서 간단한 최종 솔루션을 살펴볼 수 있습니다. https://github.com/willydavidjr/AutoFacAndAutoMapperMVC
Reference
이 문제에 관하여(Visual Studio 2019를 사용하여 MVC 5 프로젝트에 AutoFac 5 및 AutoMapper 10을 통합하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/willydavidjr/how-to-integrate-autofac-5-and-automapper-10-on-your-mvc-5-project-using-visual-studio-2019-2190텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)