在Domain包返回Service层的对象的Factory方法中传递什么对象或类?

时间:2017-01-23 09:26:46

标签: reflection domain-driven-design factory-method

我的域名包有一个名为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或switch并避免循环依赖。

选项:可以使用反射,但不知道如何使用。

1 个答案:

答案 0 :(得分:0)

  

那么我应该如何在域层中编写工厂方法来获取正确的服务层实例,而不使用if / else或switch并避免循环依赖。

您正在寻找的概念称为“依赖注入”。 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)