시작하기 전 NuGet Package에서 Autofac과 Autofac.Extensions.DependencyInjection 패키지를 검색해 내려받고 설치합니다.
패키지 설치가 완료되면 우선 DI를 적용할 대상 인터페이스를 작성합니다.
public interface IRepository
{
dbContext Data();
}
위 인터페이스는 dbContext를 반환하는 Data() 메서드를 선언하고 있으며 해당 인터페이스를 상속받아 인터페이스에서 정의한 메서드를 구현합니다.
public class Repository : IRepository
{
public dbContext Data()
{
return new dbContext();
}
}
작성된 클래스는 데이터베이스의 Entity 객체를 반환하는 클래스로서 프로젝트에서 해당 Entity를 사용하기 위해 new 연산자를 사용하지 않도록 하는 것을 목적으로 만들어진 클래스입니다.
아래 클래스는 Container에서 연결된 인터페이스의 리졸브 대상을 반환하는 클래스입니다. 해당 클래스는 그대로 복사해 넣으면 됩니다.
public static class Engine
{
private static IContainer _container;
public static void SetContainer(IContainer container)
{
_container = container;
}
public static T Resolve<T>() where T : class
{
return Scope.Resolve<T>();
}
public static T Resolve<T>(Type type) where T : class
{
return (T)Scope.Resolve(type);
}
public static object Resolve(Type type)
{
return Scope.Resolve(type);
}
private static ILifetimeScope Scope
{
get
{
if (_container != null)
return _container.BeginLifetimeScope();
throw new ArgumentNullException(nameof(_container));
}
}
Startup.cs파일에 있는 ConfigureServices() 메서드에서 아래 코드를 추가해 인터페이스와 클래스 간 DI를 생성하고 위에서 만들어둔 Engine클래스에 Container객체를 전달합니다.
var containerBuilder = new ContainerBuilder();
containerBuilder.RegisterType<Repository>().As<IRepository>().InstancePerLifetimeScope();
var container = containerBuilder.Build();
Engine.SetContainer(container);
모든 게 완료되면 이제 new를 사용하지 않고 Interfaece로 객체를 받아 클래스를 사용할 수 있게 됩니다.
public IRepository DB = Engine.Resolve<IRepository>();
참고로 Autofac과 같은 외부 package를 사용하지 않아도 기본적으로 ASP.NET Core Web API안에서 DI를 구현하는 것도 가능합니다.
다음과 같이 DI구현을 위한 인터페이스와 클래스가 존재한다면
{
public interface ICal
{
int Sum(int i, int j);
}
public class Cal : ICal
{
public int Sum(int i, int j)
{
return i + j;
}
}
}
startup.cs의 ConfigureServices() 메서드에서 DI주입을 위한 Transient 서비스를 추가하면
services.AddTransient<ICal, Cal>();
컨트롤러에서는 생성자를 통해 인터페이스로 부터 의존성주입을 처리할 수 있습니다.
private ICal _cal;
public ValuesController(ICal cal)
{
_cal = cal;
}
'.NET > ASP.NET' 카테고리의 다른 글
[ASP.NET Core Web API] Swagger와 API 명세 (0) | 2021.03.25 |
---|---|
[ASP.NET Core Web API] 파일업로드(FileUpload) (0) | 2021.03.23 |
[ASP.NET Core Web API] JWT 인증 (6) | 2021.03.23 |
[.NET Core] DB로 부터 Model 생성하기 (MySQL/MariaDB) (0) | 2021.03.21 |
[ASP.NET Core] 리눅스(CentOS 7) 설치및 구동 (0) | 2020.11.17 |