반응형
DI는 Dependency Injection(의존성 주입)입니다.
어떤 클래스가 의존하는 클래스의 인터페이스를 도입하여 의존성을 독립화하고 런타임에 의존 클래스를 결정할 수 있게끔 하는 기법입니다. 의존 클래스를 런타임에 적절한 것으로 "삽입" 한다고 해서 의존성 주입이라 합니다.
예) 전등의 전구 슬롯, 장난감의 건전지 슬롯 등등...
ILogger를 ConsoleLogger에 연결한다. ILogger를 요청하면 ConsoleLogger를 전달한다.
가장 큰 장점은 di::bind<ILogger>().to<ConsoleLogger>()코드에서 ConsoleLogger를 다른 클래스로 바꾸어 주면 injector를 사용하여 생성한 모든 Car의 Logger를 바꿀 수 있다는 것입니다.
#include <iostream>
#include <boost/di.hpp>
using namespace std;
namespace di = boost::di;
struct ILogger
{
virtual void Log(const string& s) = 0;
};
struct ConsoleLogger : ILogger
{
void Log(const string& s) override
{
cout << "LOG: " << s.c_str() << endl;
}
};
struct Car
{
shared_ptr<ILogger> mLogger;
Car(shared_ptr<ILogger> logger) : mLogger(logger)
{
mLogger->Log("making a car");
}
};
int main()
{
auto injector = di::make_injector(
di::bind<ILogger>().to<ConsoleLogger>()
);
auto car = injector.create<Car>();
}
injector.create<Car>()를 호출하여 car, car2, car3... 와 같이 생성 되었다면 di::bind<ILogger>().to<ConsoleLogger>()에서 ConsoleLogger를 CloudLogger로 바꾸어 주면 car, car2, car3의 연결이 한번에 모두 바뀌게됩니다.
auto injector = di::make_injector(
di::bind<ILogger>().to<CloudLogger>()
);
auto car = injector.create<Car>();
auto car2 = injector.create<Car>();
auto car3 = injector.create<Car>();
'프로그래밍 일반 > 객체 지향' 카테고리의 다른 글
Inheritance(상속) 그리고 Composition(구성) (0) | 2019.11.17 |
---|---|
SOLID 디자인 원칙 (0) | 2019.11.03 |
Mixin 이란? (0) | 2019.11.03 |
이상한 재귀 템플릿 패턴(Curiously Recurring Template Pattern, CRTP) (0) | 2019.10.27 |
구상(Concrete) 클래스, 추상(Abstract) 클래스 (1) | 2019.10.27 |