Visual Studio 2019를 사용하여 MVC 5 프로젝트에 AutoFac 5 및 AutoMapper 10을 통합하는 방법

내 게시물이 마음에 드셨나요?
개발자 여러분 안녕하세요!

오늘 우리는 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

좋은 웹페이지 즐겨찾기