Шаблон Против Анемичной Модели Предметной Области


Я хотел бы попросить совета у всех мысли о том, как лучше бороться с анемичной домена модель анти-паттерн при построении системы на основе web-сервисов.

Одной из наших целей является создание набора базовых web-сервисов, которые предоставляют самые основные услуги, которые мы многократно обращаться в нашу организацию, которой является создание модели домена. Сейчас у нас есть небольшая библиотека, которую мы разделяем и повторное использование, но, как мы растем в нашей команде было бы гораздо приятнее централизовать эти базовые услуги. С течением времени наши системы будут меняться, так как некоторые данные могут прийти из облака (Salesforce.com или AWS) так что мы не просто изолировать основные Дао кода в веб-сервис, а также интеграции приложений.

Например, данные наших клиентов приходит от бухгалтерского учета, CRM и порядок обработки систем. Конфигурация является реальной боли, потому что каждое приложение, что корабли должны быть в комплекте с основной библиотеки и конфигурации на каждом компьютере. Я бы хотел, чтобы централизовать создание моделей, аля, СОА, но сохранить насыщенный модели выше в слое сервиса / фасад.

Если ты думаешь вообще, что это плохо, я бы быть заинтересованы в слух почему!

Моя мысль состоит в том, чтобы определить домен объект сотрудника , который имеет файле employeeservice вводят. Во время выполнения в файле employeeservice реализации EmployeeWebServiceClientImpl , который реализует интерфейс говорит. EmployeeWebServiceClientImpl использует веб-службы прокси-сервер.

На стороне сервера веб-сервиса мы EmployeeWebService вызывая EmployeeDao для запроса к базе данных. Может просто, как легко быть класс взывая к Salesforce.com чтобы получить данные. Мы поделимся библиотека, которая содержит модель и интерфейс домена, так что вы бы десериализовать ответ веб-сервиса непосредственно в классе, который содержал необходимую бизнес-логику.

Ниже приведен пример кода, в порядке от клиента к серверу:

//Example of client
public static void main(String[] args) {
    try {
        Employee employee = Employee.getEmployee("james");
        if (employee.isEligibleForRaise()) {
            System.out.println("Give that man a raise!");
        }
    } catch (RuntimeException e) {
        System.out.println("Oh no!");
    }
}


//Employee Domain Object
public class Employee {

  private String name;

  private String username;

  private static EmployeeService service;

  public static Employee getEmployee(String username) {
    return service.getEmployee(username);
  }

  public static List<Employee> getAllEmployees() {
    return service.getAllEmployees();
  }

  public boolean isEmployeeEligibleForRaise() {
    //business logic here
    return true;
  }


//Getters & Setters

 ...
}

//EmployeeWebServiceClientImpl
public class EmployeeWebServiceClientImpl implements EmployeeService {

  //A client web service proxy to our core basic services
  BaseWebServiceProxy proxy;

  @Override
  public Employee getEmployee(String username) {
    return proxy.getEmployee(username);
  }

  @Override
  public List<Employee> getAllEmployees() {
    return proxy.getAllEmployees();
  }
}


//On the server-side we have EmployeeWebService
public class EmployeeWebService implements EmployeeService {

  EmployeeDao employeeDao;

  @Override
  public List<Employee> getAllEmployees() {
    return employeeDao.getAllEmployees();
  }

  @Override
  public Employee getEmployee(String username) {
    return employeeDao.getEmployee(username);
  }
}

Это что-то значит? В основном план, чтобы сохранить основной бизнес-логики в сотрудника предметной области, но изолировать логике доступа к данным в веб-службе.

Мысли?



2531
11
задан 28 января 2011 в 11:01 Источник Поделиться
Комментарии
2 ответа

Вы добавляя много сложности здесь. Плюс, вы идете против точки обслуживания слоем и доменной модели. Ваш домен модели должны, вероятно, использовать активные записи или картографа.

Точки слоя сервиса в качестве конечной точки (API), который содержит бизнес-логику, которая занимается интеграцией модели объектов предметной области. Слой службы должны просто хранилища запросов и делегировать вызовы для обработки бизнес-логики в модель домена (который должен проводить как можно больше бизнеса логика). Впрыскивать его в доменной модели добавляет проблем упорством, которого не должно волновать.

3
ответ дан 29 января 2011 в 01:01 Источник Поделиться

Давайте не будем шаблон тэстик.

У вас есть сотрудник, это хорошо.

Тогда у вас есть способ, чтобы найти их из различных источников? Давайте назовем его сотрудников. Тогда вы можете, возможно, получить их и найти их. Так что у вас есть сотрудники.findByName() - там, где вы ожидаете, что есть один, и возвращает работнику или бросает. Тогда у вас может быть queryByName() , где вы не знаете, если есть один на всех, который может возвращать список или итерируемый.

Тогда у вас есть несколько разных реализаций. Я лично думаю, что осущ-страшная вещь. Он добавляет больше писем, не говоря о реализации. Водонепроницаемые решил, интерфейс был человек, так что теперь мы, может быть, HttpEmployees или HibernateEmployeesсм. Мы реализовали интерфейс, дал более подробную информацию о выполнении, но не нужно использовать осущ.

Ты сделал ошибку, поставив файле employeeservice (то, что я назвал сотрудников) в сотрудника класса. Этот сотрудник не должен знать о ведении записей по сотруднику.

Кроме того, вы должны быть очень осторожны в статических методов, в этом случае вы сказали бы, что в конкретном приложении, работники могут быть найдены только из одного источника , потому что у вас есть статический. Почему бы не создать те вещи, которые должны использовать сотрудники интерфейса с конкретной реализацией...

Еще одна вещь... getAllEmployees() вряд ли будет полезен. Многие компании имеют десятки или сотни тысяч человек.....

1
ответ дан 29 января 2011 в 11:01 Источник Поделиться