재우니의 블로그

 

asp.net mvc 5 , .net framework 4.5.2, visual studio 2015, 개발환경에서 WEB API 를 개발하기 위함이고, DI 는 AUTOFAC 오픈소스를 가지고 구현하는 샘플 예제입니다.

http://www.c-sharpcorner.com/article/using-autofac-with-web-api/

아래 소스를 보면 알다시피, DI 를 설계하기 위해서는 먼저 interface 를 구현해야 합니다. 그리고 이를 가지고 구현체에서 작업을 합니다. 보통 인스턴스를 위해 new 키워드를 가지고 객체를 생성하는데, autofac 을 활용하여 의존성 주입을 생성자를 통해 객체를 생성합니다.

IDbFactory.cs 

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Threading.Tasks;  
  6.   
  7. namespace AutoFacWithWebAPI.Repository.Common  
  8. {  
  9.    public interface IDbFactory  
  10.     {  
  11.         DBCustomerEntities Init();  
  12.     }  
  13. }   

DbFactory.cs 

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Threading.Tasks;  
  6.   
  7. namespace AutoFacWithWebAPI.Repository.Common  
  8. {  
  9.     public class DbFactory : IDbFactory  
  10.     {  
  11.         DBCustomerEntities dbContext;  
  12.   
  13.         public DBCustomerEntities Init()  
  14.         {  
  15.             return dbContext ?? (dbContext = new DBCustomerEntities());  
  16.         }  
  17.     }  
  18. }   

IGenericRepository.cs 

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Threading.Tasks;  
  6.   
  7. namespace AutoFacWithWebAPI.Repository.Common  
  8. {  
  9.    public interface IGenericRepository<T> where T : class  
  10.     {  
  11.         IQueryable<T> GetAll();  
  12.     }  
  13. }   

GenericRepository.cs 

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Threading.Tasks;  
  6.   
  7. namespace AutoFacWithWebAPI.Repository.Common  
  8. {  
  9.     public class GenericRepository<T> : IGenericRepository<T> where T : class  
  10.     {  
  11.   
  12.         private DBCustomerEntities dbContext;  
  13.   
  14.         protected IDbFactory DbFactory  
  15.         {  
  16.             get;  
  17.             private set;  
  18.         }  
  19.   
  20.         protected DBCustomerEntities DbContext  
  21.         {  
  22.             get { return dbContext ?? (dbContext = DbFactory.Init()); }  
  23.         }  
  24.   
  25.         public GenericRepository(IDbFactory dbFactory)  
  26.         {  
  27.             DbFactory = dbFactory;  
  28.         }  
  29.   
  30.         public IQueryable<T> GetAll()  
  31.         {  
  32.             return DbContext.Set<T>();  
  33.         }  
  34.     }  
  35. }   

autofac 를 활용하여 web api 를 구현하기 위해서는 nuget 를 통해 Autofac, Autofac.integration.WebAPI 를 다운로드 받습니다.

이제 VISUAL STUDIO 2015 에서 WEB API 2의 컨트롤러를 생성해서 구현합니다. ApiController 를 상속받습니다.
여기서 알수 있듯이 new 키워드 없이 생성자를 통해 객체를 생성합니다.

 

CustomerController.cs 

  1. using AutoFacWithWebAPI.Repository;  
  2. using AutoFacWithWebAPI.Repository.Common;  
  3. using System;  
  4. using System.Collections.Generic;  
  5. using System.Linq;  
  6. using System.Net;  
  7. using System.Net.Http;  
  8. using System.Web.Http;  
  9.   
  10. namespace AutoFacWithWebAPI.Controllers  
  11. {  
  12.     public class CustomerController : ApiController  
  13.     {  
  14.         private readonly IGenericRepository<Customer> _customerRepository;  
  15.   
  16.         public CustomerController(IGenericRepository<Customer> customerRepository)  
  17.         {  
  18.             _customerRepository = customerRepository;  
  19.         }  
  20.   
  21.         public IQueryable<Customer> GetCustomerList()  
  22.         {  
  23.             return _customerRepository.GetAll();  
  24.         }  
  25.   
  26.     }  
  27. }   

위와 같이 사용하고자 한다면 autofac 에 대한 환경설정을 해야 합니다. .App_Start 폴더에 AutofacWebapiConfig  클래스를 생성하여 구현합니다. 저희가 만든 인터페이스 3개와 구현체를 매핑하는 부분을 아래 굵은 색으로 표시했으며, 추가적으로 생성한 인터페이스 및 클래스가 있다면, 이를 밑에 추가적으로 넣으시면 됩니다.

 

AutofacWebapiConfig.cs 

  1. using Autofac;  
  2. using Autofac.Integration.WebApi;  
  3. using AutoFacWithWebAPI.Repository;  
  4. using AutoFacWithWebAPI.Repository.Common;  
  5. using System;  
  6. using System.Collections.Generic;  
  7. using System.Data.Entity;  
  8. using System.Linq;  
  9. using System.Reflection;  
  10. using System.Web;  
  11. using System.Web.Http;  
  12.   
  13. namespace AutoFacWithWebAPI.App_Start  
  14. {  
  15.     public class AutofacWebapiConfig  
  16.     {  
  17.   
  18.         public static IContainer Container;  
  19.   
  20.         public static void Initialize(HttpConfiguration config)  
  21.         {  
  22.             Initialize(config, RegisterServices(new ContainerBuilder()));  
  23.         }  
  24.   
  25.   
  26.         public static void Initialize(HttpConfiguration config, IContainer container)  
  27.         {  
  28.             config.DependencyResolver = new AutofacWebApiDependencyResolver(container);  
  29.         }  
  30.   
  31.         private static IContainer RegisterServices(ContainerBuilder builder)  
  32.         {  
  33.             //Web API 컨트롤러 등록 처리
  34.             builder.RegisterApiControllers(Assembly.GetExecutingAssembly());  
  35.   
  36.             builder.RegisterType<DBCustomerEntities>()  
  37.                    .As<DbContext>()  
  38.                    .InstancePerRequest();  
  39.   
  40.             builder.RegisterType<DbFactory>()  
  41.                    .As<IDbFactory>()  
  42.                    .InstancePerRequest();  
  43.   
  44.             builder.RegisterGeneric(typeof(GenericRepository<>))  
  45.                    .As(typeof(IGenericRepository<>))  
  46.                    .InstancePerRequest();  
  47.   
  48.             //의존성 주입을 위해 Autofac. 에 설정합니다.
  49.             Container = builder.Build();  
  50.   
  51.             return Container;  
  52.         }  
  53.   
  54.     }  
  55. }  

 

Bootstrapper.cs 

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5. using System.Web.Http;  
  6.   
  7. namespace AutoFacWithWebAPI.App_Start  
  8. {  
  9.     public class Bootstrapper  
  10.     {  
  11.   
  12.        public static void Run()  
  13.         {  
  14.             // AutoFac  설정
  15.             AutofacWebapiConfig.Initialize(GlobalConfiguration.Configuration);  
  16.         }  
  17.   
  18.     }  
  19. }   

위에 기술한 autofac 설정 초기화를 호출을 global 의 Application_Start()  메소드에서 실행을 합니다.

Global.asax.cs 

  1. using AutoFacWithWebAPI.App_Start;  
  2. using System;  
  3. using System.Collections.Generic;  
  4. using System.Linq;  
  5. using System.Web;  
  6. using System.Web.Http;  
  7. using System.Web.Mvc;  
  8. using System.Web.Optimization;  
  9. using System.Web.Routing;  
  10.   
  11. namespace AutoFacWithWebAPI  
  12. {  
  13.     public class WebApiApplication : System.Web.HttpApplication  
  14.     {  
  15.         protected void Application_Start()  
  16.         {  
  17.   
  18.   
  19.             AreaRegistration.RegisterAllAreas();  
  20.               
  21.             Bootstrapper.Run();  
  22.   
  23.             GlobalConfiguration.Configure(WebApiConfig.Register);  
  24.             FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);  
  25.             RouteConfig.RegisterRoutes(RouteTable.Routes);  
  26.             BundleConfig.RegisterBundles(BundleTable.Bundles);  
  27.         }  
  28.     }  
  29. }