Как определить фабричные методы в Groovy / Grails? - PullRequest
0 голосов
/ 24 июня 2010

Я купил фабрику в Groovy, этот код работает, но я думаю, этот код можно улучшить (или уменьшить):

abstract class Processing {

    abstract getDirName();

    abstract getFileType();

    abstract moveFile();

    abstract processFile();

    abstract openFile();

    abstract closeFile();
}


class ProcessingBuilder {

    def processingFactory

    def orderProcess(String type) {

        def process = processingFactory.buildProcessing(type);

        process.getDirName();
        process.getFileType();
        process.moveFile();
        process.processFile();
        process.openFile();
        process.closeFile();

        return process;
    }

}

class ProcessingFactory {

      def buildProcessing(String type) {

        def process = null;

        if (type == "nanostring") {
            process = new ProcessingNanoString();
        } else if (type == "flowcore") {
            process = new ProcessingFlowCore();
        }
        return process;
    }

}

class ProcessingFlowCore extends Processing {

    def getDirName() {
      println "--> Get FlowCore directory structure"
    }

    def getFileType() {
      println "--> Get FlowCore File Type"
    }

    def moveFile() {
      println "--> Move FlowCore Files"
    }

    def processFile() {
      println "--> Import FlowCore files to DB"
    }

    def openFile() {
      println "--> Open FlowCore files"
    }

    def closeFile() {
      println "--> Close FlowCore files"
    }

}

Чтобы использовать эту фабрику:

def processingFactory = new ProcessingFactory();

def processingBuilder = new ProcessingBuilder(processingFactory : processingFactory);

def process = processingBuilder.orderProcess("flowcore");

Есть ли лучший способ построить фабрику с использованием groovy / grails?

Я также экспериментирую с ошибками, если пытаюсь использовать службы в своем классе ProcessingFlowCore: например:

class ProcessingNanoString extends Processing {

  def directoryToolsService

    def getDirName() {
      println "--> Get NanoString directory structure"

      def dir = directoryToolsService.findDirPathByName(nanostring).directoryPath

      return dir
    }

Я получаюa: ERROR errors.GrailsExceptionResolver - Невозможно вызвать метод findDirPathByName (nanostring) для нулевого объекта. (Я могу вызвать этот сервис, если я не на фабрике).

Почему?

Спасибо.

1 Ответ

3 голосов
/ 28 июня 2010

Если класс, использующий ваш сервис, находится в src / groovy, он не будет добавлен автоматически.Сервисы автоматически вводятся только в классы артефактов (например, что-либо из grails-app).Чтобы получить услугу из обычного класса, вручную получите ссылку на нее:

import org.codehaus.groovy.grails.commons.ApplicationHolder

service = ApplicationHolder.getApplication().getMainContext().getBean('directoryToolsService')
...