Dependency Injection 사용을 위해 인용 된 대부분의 예제는 팩토리 패턴을 사용하여 해결할 수도 있습니다. 의존성 주입과 팩토리의 차이가 희미하거나 희미합니다.
일단 누군가 당신이 그것을 사용하는 방법이 차이를 만든다고 말해주었습니다!
한 번 문제를 해결하기 위해 DI 컨테이너 인 StructureMap을 사용 했으며 나중에 간단한 팩토리에서 작동하도록 Structure를 다시 디자인하고 StructureMap에 대한 참조를 제거했습니다.
누구든지 그들과의 차이점과 사용 위치, 가장 좋은 방법은 무엇입니까?
답변
팩토리를 사용할 때 코드는 실제로 객체 생성을 담당합니다. DI는 그 책임을 다른 클래스 나 프레임 워크 (외부 코드와는 별도)로 아웃소싱합니다.
답변
개념을 명확하고 단순하게 유지하는 것이 좋습니다. Dependency Injection은 소프트웨어 구성 요소를 느슨하게 연결하기위한 구조적 패턴입니다. 팩토리 패턴은 다른 클래스의 객체를 만드는 책임을 다른 엔터티로 분리하는 한 가지 방법 일뿐입니다. DI를 구현하기위한 툴로 팩토리 패턴을 호출 할 수 있습니다. 의존성 주입은 생성자를 사용하는 DI, XML 파일 매핑 등을 사용하여 DI와 같은 여러 가지 방법으로 구현할 수 있습니다.
답변
의존성 주입
부품 자체를 인스턴스화하는 대신 자동차 가 작동해야하는 부품을 요구합니다.
class Car
{
private Engine engine;
private SteeringWheel wheel;
private Tires tires;
public Car(Engine engine, SteeringWheel wheel, Tires tires)
{
this.engine = engine;
this.wheel = wheel;
this.tires = tires;
}
}
공장
완전한 객체를 만들기 위해 조각을 모으고 호출자로부터 콘크리트 유형을 숨 깁니다.
static class CarFactory
{
public ICar BuildCar()
{
Engine engine = new Engine();
SteeringWheel steeringWheel = new SteeringWheel();
Tires tires = new Tires();
ICar car = new RaceCar(engine, steeringWheel, tires);
return car;
}
}
결과
보시다시피, 공장과 DI는 서로를 보완합니다.
static void Main()
{
ICar car = CarFactory.BuildCar();
// use car
}
당신은 goldilocks와 세 곰을 기억하십니까? 의존성 주입은 그런 식입니다. 동일한 작업을 수행하는 세 가지 방법이 있습니다.
void RaceCar() // example #1
{
ICar car = CarFactory.BuildCar();
car.Race();
}
void RaceCar(ICarFactory carFactory) // example #2
{
ICar car = carFactory.BuildCar();
car.Race();
}
void RaceCar(ICar car) // example #3
{
car.Race();
}
예제 # 1- 종속성을 완전히 숨기므로 최악입니다. 이 방법을 블랙 박스로 본다면 자동차가 필요하다는 것을 알 수 없습니다.
예 # 2- 자동차 공장에 들어서서 자동차가 필요하다는 것을 알았으므로 조금 더 좋습니다. 그러나 이번에는 실제로 필요한 모든 방법이 자동차이기 때문에 너무 많이 전달됩니다. 우리는 자동차가 방법 외부에 건설되어 통과 할 수있을 때 자동차를 만들기 위해 공장을 통과하고 있습니다.
예제 # 3- 메소드가 필요한 것을 정확하게 요구하기 때문에 이상적입니다 . 너무 많거나 적지 않습니다. MockCars를 만들기 위해 MockCarFactory를 작성할 필요는 없습니다. 모의를 바로 전달할 수 있습니다. 직접적이고 인터페이스가 거짓말을하지 않습니다.
Misko Hevery의이 Google Tech Talk는 놀랍고 필자의 모범을 바탕으로 한 것입니다. http://www.youtube.com/watch?v=XcT4yYu_TTs
답변
DI (Dependency Injection)와 팩토리 패턴이 유사한 이유는 소프트웨어 아키텍처 인 IoC (Inversion of Control)의 두 가지 구현이기 때문입니다. 간단히 말해서 그들은 같은 문제에 대한 두 가지 해결책입니다.
질문에 대답하기 위해 팩토리 패턴과 DI의 주요 차이점은 객체 참조를 얻는 방법입니다. 이름이 암시하는 것처럼 의존성 주입을 사용하면 참조가 주입되거나 코드에 제공됩니다. 팩토리 패턴을 사용하면 코드에서 객체를 가져 오도록 코드에서 참조를 요청해야합니다. 두 구현 모두 코드와 코드에서 사용하는 기본 클래스 또는 객체 참조 유형 간의 연결을 제거하거나 분리합니다.
팩토리 패턴 (또는 실제로 오브젝트 참조를 리턴하는 새 팩토리를 리턴하는 팩토리 인 추상 팩토리 패턴)은 런타임시 요청되는 오브젝트의 유형 또는 클래스에 동적으로 선택하거나 링크하도록 작성 될 수 있습니다. 이것은 IoC의 또 다른 구현 인 Service Locator 패턴과 매우 유사합니다 (DI보다 훨씬 더).
팩토리 디자인 패턴은 상당히 오래되었으며 (소프트웨어 측면에서) 오랫동안 사용되었습니다. 최근 건축 패턴 IoC의 인기가 높아지면서 다시 부활하고 있습니다.
IoC 디자인 패턴과 관련하여 인젝터가 주입되고 로케이터가 배치되며 공장이 리팩터링되었습니다.
답변
의존성 주입으로 쉽게 해결할 수있는 문제가 있는데, 이는 일련의 공장에서는 쉽게 해결할 수 없습니다.
한편으로 제어 및 의존성 주입 (IOC / DI)의 역전과 서비스 로케이터 또는 공장 (공장)의 차이점은 다음과 같습니다.
IOC / DI는 도메인 객체와 서비스 자체의 완전한 생태계입니다. 지정한 방식으로 모든 것을 설정합니다. 도메인 객체와 서비스는 컨테이너에 의해 구성되어, 자신을 구성하지 않는다 : 그들은 그러므로이없는 모든 컨테이너에 또는 공장에 종속. IOC / DI는 애플리케이션의 최상위 계층 (GUI, 웹 프론트 엔드)에 단일 구성 (컨테이너 구성)으로 모든 구성이 가능한 매우 높은 수준의 구성 성을 허용합니다.
팩토리는 도메인 객체 및 서비스 구성의 일부를 추상화합니다. 그러나 도메인 객체와 서비스는 여전히 자신을 구성하는 방법과 의존하는 모든 것을 얻는 방법을 알아낼 책임이 있습니다. 이러한 “활성”종속성은 응용 프로그램의 모든 계층을 통해 항상 필터링됩니다. 모든 것을 구성 할 단일 장소는 없습니다.
답변
DI의 한 가지 단점은 논리로 개체를 초기화 할 수 없다는 것입니다. 예를 들어, 임의의 이름과 연령을 가진 문자를 만들어야하는 경우 DI는 공장 패턴을 선택하는 것이 아닙니다. 팩토리를 사용하면 개체 생성에서 임의 알고리즘을 쉽게 캡슐화 할 수 있습니다.이 알고리즘은 “변화하는 요소 캡슐화”라는 디자인 패턴 중 하나를 지원합니다.
답변
수명주기 관리는 인스턴스화 및 주입 외에도 종속성 컨테이너가 담당하는 책임 중 하나입니다. 컨테이너가 인스턴스화 후 구성 요소에 대한 참조를 유지한다는 사실은 팩토리가 아니라 “컨테이너”라고하는 이유입니다. 의존성 주입 컨테이너는 일반적으로 수명주기를 관리하는 데 필요한 객체 또는 싱글 톤 또는 플라이 웨이트와 같은 향후 주입에 재사용되는 객체 만 참조합니다. 컨테이너를 호출 할 때마다 일부 구성 요소의 새 인스턴스를 작성하도록 구성된 경우 컨테이너는 일반적으로 작성된 오브젝트를 잊어 버립니다.
보낸 사람 : http://tutorials.jenkov.com/dependency-injection/dependency-injection-containers.html