2017-01-23 2 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); 
    } 
} 

だから私は、if/ELSEまたはスイッチを使用して回避することなく、サービス層の正しいインスタンスを取得するには、ドメイン層に私のファクトリメソッドを書くべきか循環依存性。

オプション:反射を使用することはできますが、方法はわかりません。

+0

「正しいインプラント」とは何ですか?どの基準に基づいて決定されるのか? – guillaume31

+0

異なるバージョンのリソースがあり、各バージョンごとに1つのインプリメンテーションがあるとしたら、そのリソースバージョンに対して正しいインプリメンテーションをインスタンス化したいとします。 – user2340345

+0

'ServiceClass.service()'はどこからリソースを取得しますか?異なる時点でのソースコードのバージョンと同じバージョンを意味しますか? – guillaume31

答えて

0

したがって、if/elseを使用せずに、または循環的な依存関係を避けて、サービスレイヤの正しいインスタンスを取得するために、ファクトリメソッドをドメインレイヤーに書き込む必要があります。

あなたが探しているコンセプトを「依存性注入」といいます。 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) 
関連する問題