2017-01-23 9 views
0

도메인 패키지에 MyInterface이라는 인터페이스가 있습니다. 또한 MyFactory이라는 팩토리 클래스가 있으며 런타임시 MyInterface를 구현하는 클래스의 인스턴스를 만드는 데 도움이됩니다.서비스 레이어의 객체를 반환하는 도메인 패키지의 팩토리 메소드에서 전달할 객체 또는 클래스는 무엇입니까?

도메인 계층

interface MyInterface{ 
    //some Domain specific methods here 
} 

class MyFactory{ 
    public static MyInterface getInstance(Object resource) { 

    // return MyInterfaceImpl instance via the methods 
    // this Object can also be a Class argument, where I do 
    // Class.forName("").newInstance(); but this is a bad design. 
} 


class DomainServiceImpl { 
    public void domainMethod(Object res) { 
     MyInterface i = MyFactory.getInstance(res); 
    } 
} 

서비스 층

class Class1 implements MyInterface { 

} 

class Class2 implements MyInterface { 

} 

class ServiceClass { 
    public void service() { 
     domainServiceImpl.domainMethod(Object res); 
    } 
} 

그래서 나는 경우/다른 사람 또는 스위치를 사용하여 피하지 않고 서비스 계층의 올바른 인스턴스를 얻기 위해 도메인 층 내 공장 메서드를 작성하는 방법 순환 종속성.

옵션 : 반사를 사용할 수 있지만 확실하지는 않습니다.

+0

"올바른 impl"이란 무엇입니까? 언제 그 기준을 결정할 것인가? – guillaume31

+0

다른 버전의 리소스가 있고 각각의 버전에 대해 하나의 impl을 얻은 다음 해당 리소스 버전에 대해 올바른 impl을 인스턴스화하고 싶습니다. – user2340345

+0

'ServiceClass.service()'는 어디에서 자원을 가져 옵니까? 다른 시점의 소스 코드 버전과 같은 버전을 의미합니까? – guillaume31

답변

0

if/else를 사용하거나 순환 종속성을 피하고 사용하지 않고 서비스 레이어의 올바른 인스턴스를 얻으려면 도메인 레이어에 factory 메소드를 어떻게 작성해야합니까?

찾고있는 개념을 "종속성 주입"이라고합니다. Misko Hevery이 주제에 대한 많은 자료를 게시했습니다. 도메인 층에서

, 당신은 서비스 제공에 대한 인터페이스를 정의하고 생성자
interface MyFactory { 
    public MyInterface getInstance(Object resource); 
} 

class DomainServiceImpl { 
    final MyFactory factory; 

    // "Dependency Injection" 
    public DomainServiceImpl(MyFactory factory) { 
     this.factory = factory 
    } 

    public void domainMethod(Object res) { 
     MyInterface i = MyFactory.getInstance(res); 
    } 
} 

그리고 외부에서, 당신이 필요로하는 공장을 구현할 수

를 통해 구현에 그 서비스 제공을 주입.

class Class1MyFactory implements MyFactory { 
    public MyInterface getInstance() { 
     return ...; 
    } 
} 

그리고 ....이 서비스를 구성하는 시간이 때, 당신은 멀리 가고 의존성을 선택하고 서비스

class ServiceClass { 
    final domainServiceImpl; 

    public ServiceClass(DomainServiceImpl domainServiceImpl) { 
     this.domainServiceImpl = domainServiceImpl; 
    } 

    public void service() { 
     domainServiceImpl.domainMethod(Object res); 
    } 
} 

을에서 적절한 시점에서 그것을 주입

MyFactory myFactory = new Class1MyFactory(...); 
DomainServiceImpl domainServiceImpl = new DomainServiceImpl(myFactory) 
ServiceClass service = new ServiceClass(domainServiceImple)