Существует два основных способа определения бизнес-правил при проектировании вашего домена.
1.) Доменные сущности - это базовые POCO / DTO s.И вы передаете их доменным службам.Эти сервисы могут быть такими же простыми, как другой класс, или они действительно могут быть реальными сервисами, расположенными на другом сервере.
var user = repository.Find(x => x.UserName == userName);
if (userLogonService.IsValidUser(user, password)) {
userLogonService.UpdateUserAsLoggedOn(user);
}
repository.SaveChanges();
2.) Объекты домена содержат свою собственную логику работы.Это ближе к тому, что последуют многие паттерны MVC. И так как вы спросили, это модель, которую я предпочитаю.
var user = repository.Find(x => x.UserName == userName);
if (user.CheckPassword(password)) {
user.LogOnNow();
}
repository.SaveChanges();
Оба являются полностью действительными шаблонами.# 1 имеет отдельный уровень бизнес-операций, но страдает от Анемичная модель предметной области .# 2 может привести к созданию больших доменов, если ваш домен начинает усложняться или если модель может многое сделать.
РЕДАКТИРОВАТЬ # 1: Ответ Джону Крафту
Oven.Bake (myPizza) против myPizza.Bake ()
Я в основном согласен.Есть ли у вас единая служба Духовки, или у вас есть десятки доступных печей, которые хранятся в хранилище духовок, где духовка - это просто еще один домен?В # 2 печь является частью домена.Как я обычно занимаюсь моделированием предметной области, большинство существительных - это сущности предметной области , если только вы не уверены на 100%, что это именно то, что нужно.выпекается.
interface ICanBeBaked {
int BakeMinutes { get; }
int BakeTemp { get; }
void Bake();
}
class Pizza : ICanBeBaked {
int BakeMinutes { get { return 15; } }
int BakeTemp { get { return 425; } }
void Bake() {
// melt cheese!
this.isBaked = true;
}
}
class Oven {
void Bake(ICanBeBaked thingToBake) {
// set the temp, reserve this oven for the duration, etc.
thingToBake.Bake();
}
}