2017-03-24 6 views
0

와 코드를 향상 주입 :나는 다음과 같은 코드를 향상시킬 수있는 방법을 찾고 공장 패턴과 DI

container.Bind<IExampleA>().To.<ExampleA>(); 
container.Bind<IExampleB>().To.<ExampleB>(); 
container.Bind<IExampleFactory>().To.<ExampleFactory>(); 

그리고 어떤 포인터가이 인정 될 것이다

public class ExampleUsage() 
{  
    ExampleFactory _exampleFactory; 

    public ExampleUsage(ExampleFactory exampleFactory) 
    { 
     _exampleFactory = exampleFactory; 
    } 

    public void useFactory(Test obj) 
    { 
     var implementation = _exampleFactory.Make(obj.ThisIsAnEnum); 
     implementation.Do(); 
    } 
} 

같이 사용되는, 감사!

는 ** 내가 잊고 있었던 편집 ExampleA와 ExampleB 모두 당신이 공장에 잘못된 일을 생각 DI

public class ExampleA: IExampleA 
{ 
    IDependencyA _dependencyA; 
    IDependencyB _dependencyB; 

    public ExampleA(IDependencyA dependencyA, IDependencyB dependencyB) 
    { 
     _dependencyA = dependencyA; 
     _dependencyB = dependencyB; 
    } 

    public void Do(); 
} 

public class ExampleB: IExampleB 
{ 
    IDependencyA _dependencyA; 
    IDependencyB _dependencyB; 
    IDependencyC _dependencyC; 

    public ExampleA(IDependencyA dependencyA, IDependencyB dependencyB, IDependencyC dependencyC) 
    { 
     _dependencyA = dependencyA; 
     _dependencyB = dependencyB; 
     _dependencyC = dependencyC; 
    } 
    public void Do(); 
} 

container.Bind<IDependencyA>().To.<DependencyA>(); 
container.Bind<IDependencyB>().To.<DependencyB>(); 
container.Bind<IDependencyC>().To.<DependencyC>(); 
+1

코드 개선에 대한 질문은 http://codereview.stackexchange.com을 사용하십시오. –

+0

감사합니다! @SergeyBerezovskiy –

+0

이 질문을 만들었습니다 : http://codereview.stackexchange.com/questions/158733/advide-on-factory-pattern-with-di-implementation –

답변

0

에 의해 처리 될 필요가 일부 종속성이 언급합니다.

예제 A와 예제 B를 팩토리에 삽입 할 필요는 없습니다.

팩토리 패턴은 생성을 담당하므로 팩토리 클래스에서 인스턴스화 할 수 있습니다.

이렇게하면 공장을 IExampleFactory의 다른 구현으로 쉽게 대체 할 수 있습니다.

* 편집 된 추가 세부 정보.

실제로 DI 컨테이너는 팩토리로 간주 될 수 있습니다 (둘 다 객체 생성을 담당 함).

하지만 공장 방식으로 가고 싶다면 직접 인스턴스화 논리를 구현할 수 있습니다.

물론 종속성을 공장에서 처리해야합니다.

팩토리 인터페이스는 별도로 생성 할 객체를 정의하는 것이 좋습니다.

public interface IExampleFactory 
{ 
    IExampleA CreateExampleA(); 
    IExampleB CreateExampleB(); 
} 

그런 다음 콘크리트 팩토리는 각 개체의 인스턴스화 프로세스를 처리해야합니다.

개체를 인스턴스화하기 위해 모든 종속성을 얻을 수 있습니다 (각 개체마다 서로 다른 종속성이있을 수 있음).

public class ExampleFactory: IExampleFactory 
{ 
    IExampleA CreateExampleA() 
    { 
     //instantiating concrete object A with its dependencies 

     return concreteA; 
    } 

    IExampleB CreateExampleB(); 
    { 
     //instantiating concrete object B with its dependencies 

     return concreteB; 
    } 
} 
+0

고마워, 네가 맞아, 내 공장을 바꿀 방법을 찾고있어. 구체적인 구현체를 반환하기 위해서 유일한 문제는 (예를 들어이 예제에 넣지 않았다. 초에 추가한다) ExampleA와 ExampleB 클래스는 DI가 관리하는 많은 의존성을 가지고있다. if 종속성을 스스로 관리해야하는 구체적인 클래스를 반환해야했습니다. –