당신이 암시 한 것처럼, 그것은 DAO에 대한 더 많은 것 같이 들립니다. DAO는 데이터 영역 기술을 완전히 추상화하려는 비 DDD 프로젝트에서 매우 유용하다고 생각합니다.
트랜잭션 스크립트가 실행되는 한 데이터 영역 디자인과 직각을 이룹니다. 트랜잭션 스크립트는 각 비즈니스 운영이 절차 적 호출로 그룹화된다는 것을 의미합니다. 예 : 트랜잭션 스크립트 패턴은 서버 측 WCF 서비스 호출에서 자주 사용되며 각 서비스 메소드는 트랜잭션 스크립트 패턴을 따릅니다. 이 방법으로 생각해보십시오. 트랜잭션 스크립트를 사용하면 실제 비즈니스 논리가 객체에 있지 않고 트랜잭션 스크립트 프로 시저 호출에 직접 기록됩니다. 공통 비즈니스 로직은 트랜잭션 스크립트간에 공유 될 수 있지만 일반적으로 정적 메소드, 헬퍼 등을 통해 수행되며 "순수한"OO가 아닙니다.
여기에 의사 코드
// traditional transaction script
public class MailService
{
public void UpdateEmail(string userName, string newEmail)()
{
if(db.UserExists(userName))
{
if(EmailHelper.ValidateEmailFormat(newEmail))
{
db.UpdateEmail(userName, newEmail);
}
}
}
}
// transaction script with anemic domain objects
public class MailService
{
public void UpdateEmail(string userName, string newEmail)()
{
var userDAO = new UserDAO();
var emailDAO = new EmailDAO();
var existingUser = userDAO.GetUserByName(userName);
if(existingUser != null)
{
if(EmailHelper.ValidateEmailFormat(newEmail))
{
emailDAO.UpdateEmail(existingUser, newEmail);
}
}
}
}
// More of an OO/DDDish approach
public class MailService
{
public void UpdateEmail(string userName, string newEmail)()
{
var userRepository = new Repository<User>();
var userToUpdate = userRepository.Where(x => x.UserName = userName).FirstOrDefault();
if(userToUpdate != null)
{
userToUpdate.Email = newEmail;
if (user.IsValid())
{
userRepository.Update(userToUpdate);
}
}
}
}
의 비트가 분명히 첫 번째 예는 전혀 OO되지 않습니다이다. 두 번째 예제는 모든 비즈니스 로직이 MailService 호출에서 발생하므로 객체 지향보다 객체 기반입니다. 세 번째 예는 전통적인 OO입니다. 서비스 호출에서는 제어 흐름 만 발생합니다. 모든 비즈니스 로직은 User.IsValid() 메소드에서 처리됩니다.
비즈니스 논리를 어디에 두는 것까지 모두 중요합니다.
당신은 정말로 트랜잭션 스크립트를 만드는 것에 대해 좀 더 자세히 설명 할 수 있습니까? 내가 말한이 디자인은 DDD가 아니며 Active Record가 아닙니다. 그래서 무엇입니까? 내 중간 계층/계층 메서드 (WCF 서비스이든 BLL 호출이든)는 ContactManager가 실제 엔터티가 아닌 전자 메일, 주소, 전화에서 작업을 수행하는 논리적 그룹 인 ContactsManager.AddEmail (전자 메일)과 같은 것으로 가정합니다. 예를 들어 엔티티. – e36M3
DAO가 POCO 엔티티에서 작동하는 경우 두 번째 예제에서 두 번째 트랜잭션 스크립트 예제 인 –
을 제공하도록 업데이트되었습니다. 빈 도메인 개체가 포함 된 트랜잭션 스크립트라는 사실을 변경하지 않는다고 가정합니다.또는 existingUser가 User 유형이고 newEmail이 전자 메일 유형일 수있는 코드가 이미 암시하고 있습니다. 논리 그 자체가 엔티티에 없다는 사실은 그것을 빈혈로 만드는 것인데, POCO를 사용하면 그것을 변경하지 않습니다. – e36M3