logo MSJO.kr

Dependency Injection using Autofac

2019-09-23
MsJ

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

Prεv(Θld)   Nεxt(Nεw)
Content
Search     RSS Feed     BY-NC-ND