2015-10-01 2 views
4

Я знаю разницу между сервисами домена и приложений. Но не может реально увидеть разницу между методами в области сущностей и служб домена:/Доменные службы и методы сущности в доменной модели

У меня есть игра, которая имеет State, Players и т.д .. Он также имеет такие методы, как AddPlayer, MoveLeft, Jump. Куда идут эти методы? Должен ли я создать голый KOGame с только свойствами, а затем KOGameServices с функциональностью?

Дядя Боб в своей статье here написал «Сущность может быть объектом с методами или может быть набором структур данных и функций».

Я даже не хочу отметить, что такие методы, как Move или Jumpпридется быть также в App Услуги в KOGameAPI - вызвать эти методы необходимы UI (через интерфейсы, конечно).

Вот мой класс:

public class KOGame 
{ 
    public GameState State { get; set; } 
    public IList<Player> Players { get; set; } 
    public int PlayersCount; 

    public KOGame() 
    { 
     State = GameState.New; 
     PlayersCount = 2; 
     Players = new List<Player>(); 
    } 

    public void AddPlayer(Player player) 
    { 
    } 

    public bool MoveRight(int id) 
    { 
     return false; 
    } 

    public bool MoveLeft(int id) 
    { 
     return false; 
    } 

    public bool Jump(int id) 
    { 
     return false; 
    } 
} 

Итак, укутать на мой вопрос: Какие методы идет в доменных службах и какие методы идет к Entities домена? Имея, например, класс Class1, когда следует создать класс Class1Services?

EDIT: Только быстрое объяснение, почему я выбираю DDD: Я хочу создать кросс приложение платформы, и я хочу иметь один слой общей для каждой платформы. Я выбираю C#, вызываю с помощью Xamarin Я могу легко реализовать однодоменную модель и даже услуги для каждой платформы. Я просто застрял при решении вопроса о том, какие методы следует использовать в Сервисах, и что в составе объектов в Domain Model

+1

Луковая архитектура, DDD, услуги доменов, услуги Applicacion ... Для архитектуры видеоигры? Я думаю, что вы ошибетесь. – jlvaquero

+0

@jlvaquero +1, для некоторых медленных игр на основе браузера это может быть вариант, но здесь это похоже на игру в реальном времени, поэтому я определенно соглашусь, что DDD не подходит. – guillaume31

+0

@jlvaquero Хорошо, но вопрос в том, какие методы относятся к доменным службам и какие методы относятся к объектам домена? Имея, например, класс Class1, когда я должен создать класс Class1Services? –

ответ

5

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

+0

Один вопрос: почему вы изменили _entity_ на _aggregate_? –

+0

Поскольку в DDD у вас должны быть агрегаты, которые могут быть одним или несколькими объектами, которые должны быть согласованными, а совокупность - это термин. – jlvaquero

+0

@AntwanReno Я предлагаю вам читать DDD немного больше, особенно синяя или красная книга должны прочитать IMO. Доменные службы - одна из основ, которые они охватывают. – guillaume31

5

Если метод логически принадлежит сущности, поместите его туда. Если нет какого-либо объекта, где метод будет иметь смысл, поместите его в службу домена (без гражданства!).

Например, способ перемещения игрока должен быть на игрока лица - он чувствует себя естественно иметь его там, потому что изменяет, что конкретный игрок.

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

+0

, но оба домена и доменные службы должны быть на одном уровне, не так ли? Просто разные классы? (например, в Visual Studio - оба должны быть в одном проекте «MyApp.Domain», правильно? –

+0

Да, оба принадлежат к * доменной модели *. – theDmi