Autofac is an IoC container for Microsoft .NET. It manages the dependencies between classes so that applications stay easy to change as they grow in size and complexity(GitHub-Autofac 2019). Autofac is an addictive Inversion of Control container for .NET Core, ASP.NET Core, .NET 4.5.1+, Universal Windows apps, and more(autofac.org 2019).
닷넷 프레임워크를 사용하다 보면 의존성 주입이란 단어가 자주 등장한다. ASP.NET Core MVC, WPF MVVM 그리고 Caliburn.Micro에서 Ioc.Get<T>() 에서 DI를 사용하는 예를 볼 수 있는 데 이번 글에서는 일반적인 개발환경에서 DI를 자동으로 그리고 쉽게 사용할 수 있는 Autofac 패키지의 사용법을 간단하게 작성해보았다. 참고 : 일반적인 DI, Interface 사용법 보기
메인 프로그램
// Program.cs
using Autofac;
using System;
namespace ConsoleUI
{
class Program
{
static void Main()
{
var container = ContainerConfig.Configure();
using(var scope = container.BeginLifetimeScope())
{
var app = scope.Resolve<IApplication>();
app.Execute();
}
Console.ReadLine();
}
}
}
// other Main
namespace ConsoleUI
{
class Program
{
static void Main()
{
var container = BuildContainer();
using(var scope = container.BeginLifetimeScope())
{
scope.Resolve<IApplication>().Run(); // Run()함수실행
}
}
private static IContainer BuildContainer()
{
var builder =- new ContainderBuilder();
builder.RegisterAssemblyTypes(Assembly.GetExcutingAssembly()).AsSelf().AsImplementedInterfaces();
return builder.Build();
}
}
}
Autofac 설정 파일
// 인테페이스 연결
// ContainerConfig.cs
using Autofac;
using System.Linq;
using System.Reflection;
namespace ConsoleUI
{
public static class ContainerConfig
{
public static IContainer Configure()
{
var builder = new ContainerBuilder();
builder.RegisterType<Application>().As<IApplication>();
//builder.RegisterType<DBHelper>().As<IDBHelper>();
//DBHelper -> DBHelperOther로 간단하게 로직 변경
builder.RegisterType<DBHelperOther>().As<IDBHelper>();
//Services 폴더의 인테페이스 파일 자동등록
builder.RegisterAssemblyTypes(Assembly.Load(nameof(ConsoleUI)))
.Where(t => t.Namespace.Contains("Services"))
.As(t => t.GetInterfaces().FirstOrDefault(i => i.Name == "I" + t.Name));
return builder.Build();
}
}
}
Application 파일
// 메인프로그램에서 사용한다.
// Application.cs
namespace ConsoleUI
{
public class Application : IApplication
{
private readonly IDBHelper _dbHelper;
public Application(IDBHelper dbHelper)
{
_dbHelper = dbHelper;
}
public void Execute()
{
_dbHelper.ProcessDB();
}
}
}
// IApplication.cs
namespace ConsoleUI
{
public interface IApplication
{
void Execute();
}
}
DBHelper.cs
using ConsoleUI.Services;
using System;
namespace ConsoleUI
{
public class DBHelper : IDBHelper
{
private readonly IDBConnection _dbConnection;
private readonly ILogger _logger;
public DBHelper(IDBConnection dbConnection, ILogger logger)
{
_logger = logger;
_dbConnection = dbConnection;
}
public void ProcessDB()
{
_logger.Log("Starting DB...");
Console.WriteLine("데이터 처리");
_dbConnection.DBOpen("SQL Server");
_dbConnection.DBClose();
_logger.Log("Finished DB...");
}
}
public class DBHelperOther : IDBHelper
{
private readonly IDBConnection _dbConnection;
private readonly ILogger _logger;
public DBHelperOther(IDBConnection dbConnection, ILogger logger)
{
_logger = logger;
_dbConnection = dbConnection;
}
public void ProcessDB()
{
_logger.Log("Starting OtherDB...");
Console.WriteLine("Other 데이터 처리");
_dbConnection.DBOpen("Other Database");
_dbConnection.DBClose();
_logger.Log("Finished OtherDB...");
}
}
}
// IDBHelper.cs
namespace ConsoleUI
{
public interface IDBHelper
{
void ProcessDB();
}
}
기타 파일
// Services 폴더에 작성한다.
// DBConnection.cs
using System;
namespace ConsoleUI.Services
{
class DBConnection : IDBConnection
{
public void DBOpen(string name)
{
Console.WriteLine($"Open Database - {name}");
}
public void DBClose()
{
Console.WriteLine("Close Database");
}
}
}
// IDBConnection.cs
namespace ConsoleUI.Services
{
public interface IDBConnection
{
void DBOpen(string name);
void DBClose();
}
}
// Logger.cs
using System;
namespace ConsoleUI.Services
{
public class Logger : ILogger
{
public void Log(string message)
{
Console.WriteLine($"Logging - {message}");
}
}
}
// ILogger.cs
namespace ConsoleUI.Services
{
public interface ILogger
{
void Log(string message);
}
}