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
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
- namespace AutoFacWithWebAPI.Repository.Common
- {
- public interface IDbFactory
- {
- DBCustomerEntities Init();
- }
- }
DbFactory.cs
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
- namespace AutoFacWithWebAPI.Repository.Common
- {
- public class DbFactory : IDbFactory
- {
- DBCustomerEntities dbContext;
-
- public DBCustomerEntities Init()
- {
- return dbContext ?? (dbContext = new DBCustomerEntities());
- }
- }
- }
IGenericRepository.cs
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
- namespace AutoFacWithWebAPI.Repository.Common
- {
- public interface IGenericRepository<T> where T : class
- {
- IQueryable<T> GetAll();
- }
- }
GenericRepository.cs
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
- namespace AutoFacWithWebAPI.Repository.Common
- {
- public class GenericRepository<T> : IGenericRepository<T> where T : class
- {
-
- private DBCustomerEntities dbContext;
-
- protected IDbFactory DbFactory
- {
- get;
- private set;
- }
-
- protected DBCustomerEntities DbContext
- {
- get { return dbContext ?? (dbContext = DbFactory.Init()); }
- }
-
- public GenericRepository(IDbFactory dbFactory)
- {
- DbFactory = dbFactory;
- }
-
- public IQueryable<T> GetAll()
- {
- return DbContext.Set<T>();
- }
- }
- }
autofac 를 활용하여 web api 를 구현하기 위해서는 nuget 를 통해 Autofac, Autofac.integration.WebAPI 를 다운로드 받습니다.
이제 VISUAL STUDIO 2015 에서 WEB API 2의 컨트롤러를 생성해서 구현합니다. ApiController 를 상속받습니다.
여기서 알수 있듯이 new 키워드 없이 생성자를 통해 객체를 생성합니다.
CustomerController.cs
- using AutoFacWithWebAPI.Repository;
- using AutoFacWithWebAPI.Repository.Common;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Net;
- using System.Net.Http;
- using System.Web.Http;
-
- namespace AutoFacWithWebAPI.Controllers
- {
- public class CustomerController : ApiController
- {
- private readonly IGenericRepository<Customer> _customerRepository;
-
- public CustomerController(IGenericRepository<Customer> customerRepository)
- {
- _customerRepository = customerRepository;
- }
-
- public IQueryable<Customer> GetCustomerList()
- {
- return _customerRepository.GetAll();
- }
-
- }
- }
위와 같이 사용하고자 한다면 autofac 에 대한 환경설정을 해야 합니다. .App_Start 폴더에 AutofacWebapiConfig 클래스를 생성하여 구현합니다. 저희가 만든 인터페이스 3개와 구현체를 매핑하는 부분을 아래 굵은 색으로 표시했으며, 추가적으로 생성한 인터페이스 및 클래스가 있다면, 이를 밑에 추가적으로 넣으시면 됩니다.
AutofacWebapiConfig.cs
- using Autofac;
- using Autofac.Integration.WebApi;
- using AutoFacWithWebAPI.Repository;
- using AutoFacWithWebAPI.Repository.Common;
- using System;
- using System.Collections.Generic;
- using System.Data.Entity;
- using System.Linq;
- using System.Reflection;
- using System.Web;
- using System.Web.Http;
-
- namespace AutoFacWithWebAPI.App_Start
- {
- public class AutofacWebapiConfig
- {
-
- public static IContainer Container;
-
- public static void Initialize(HttpConfiguration config)
- {
- Initialize(config, RegisterServices(new ContainerBuilder()));
- }
-
-
- public static void Initialize(HttpConfiguration config, IContainer container)
- {
- config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
- }
-
- private static IContainer RegisterServices(ContainerBuilder builder)
- {
-
- builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
-
- builder.RegisterType<DBCustomerEntities>()
- .As<DbContext>()
- .InstancePerRequest();
-
- builder.RegisterType<DbFactory>()
- .As<IDbFactory>()
- .InstancePerRequest();
-
- builder.RegisterGeneric(typeof(GenericRepository<>))
- .As(typeof(IGenericRepository<>))
- .InstancePerRequest();
-
- 에 설정합니다.
- Container = builder.Build();
-
- return Container;
- }
-
- }
- }
Bootstrapper.cs
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.Http;
-
- namespace AutoFacWithWebAPI.App_Start
- {
- public class Bootstrapper
- {
-
- public static void Run()
- {
- 설정
- AutofacWebapiConfig.Initialize(GlobalConfiguration.Configuration);
- }
-
- }
- }
위에 기술한 autofac 설정 초기화를 호출을 global 의 Application_Start() 메소드에서 실행을 합니다.
Global.asax.cs
- using AutoFacWithWebAPI.App_Start;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.Http;
- using System.Web.Mvc;
- using System.Web.Optimization;
- using System.Web.Routing;
-
- namespace AutoFacWithWebAPI
- {
- public class WebApiApplication : System.Web.HttpApplication
- {
- protected void Application_Start()
- {
-
-
- AreaRegistration.RegisterAllAreas();
-
- Bootstrapper.Run();
-
- GlobalConfiguration.Configure(WebApiConfig.Register);
- FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
- RouteConfig.RegisterRoutes(RouteTable.Routes);
- BundleConfig.RegisterBundles(BundleTable.Bundles);
- }
- }
- }