dependency injection using autofac

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();
        }
    }
}
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);
    }
}