나는 응용 프로그램 계층에서 팩토리를 선호합니다.
는 도메인 계층에 공장을 유지하는 경우는 매개 변수로 복잡한 유형 (C# 코드 예제) 필요로 할 때, 그들이 당신을 도움이되지 않습니다 : 또한
Application Layer:
//this Factory resides in the Domain Layer and cannot reference anything else outside it
Person person = PersonAggregateFactory.CreateDeepAndLargeAggregate(
string name, string code, string streetName,...
and lots of other parameters...);
//these ones reside in Application Layer, thus can be much more simple and readable:
Person person = PersonAggregateFactory.CreateDeepAndLargeAggregate(CreatePersonCommand);
Person person = PersonAggregateFactory.CreateDeepAndLargeAggregate(PersonDTO);
Domain Layer:
public class Person : Entity<Person>
{
public Address Address {get;private set;}
public Account Account {get;private set;}
public Contact Contact {get;private set;}
public string Name {get;private set;}
public Person(string name, Address address,Account account, Contact contact)
{
//some validations & assigning values...
this.Address = address;
//and so on...
}
}
public class Address:Entity<Address>{
public string Code {get;private set;}
public string StreetName {get;private set;}
public int Number {get;private set;}
public string Complement {get;private set;}
public Address(string code, string streetName, int number, string complement?)
{
//some validations & assigning values...
code = code;
}
}
public class Account:Entity<Account>{
public int Number {get;private set;}
public Account(int number)
{
//some validations & assigning values...
this.Number = number;
}
}
//yout get the idea:
//public class Contact...
을, 내부 유지 공장에 대한 의무가 없다 (Domain Driven Design Quickly)에서 도메인 계층 그러므로
는 자체 더 재를 갖지 않을 수 개별 객체에 복잡한 목적 및 응집체 인스턴스를 생성하는 책임을 이동 도메인 모델의 스폰서 쉽이지만 은 여전히 도메인 디자인의 일부입니다. 모든 복잡한 어셈블리를 캡슐화하고 클라이언트가 구체화 된 인스턴스의 인스턴스를 참조 할 필요가없는 인터페이스를 제공하십시오. 전체를 하나의 단위로 만들어 불변량을 적용합니다.
팩토리를 사용하여 메모리에 영구 객체를로드하지 않기 때문에 응용 프로그램의 다른 레이어에서 액세스 할 필요가 없습니다. 다음 (Domain Driven Design Quickly에서) 이유는 다음과 같습니다
또 다른 관찰 공장은 처음부터 새로운 객체 를 만들 필요가, 또는 그들이 이전에 존재하는 객체를 재구성해야하지만, 아마도되어 데이터베이스에 지속 한 것입니다. 데이터베이스에있는 나머지 장소에서 엔티티를 다시 메모리에 가져 오려면 을 새로 만드는 것과 완전히 다른 프로세스가 필요합니다. 한 가지 분명한 차이점은 새 개체에는 새 ID가 필요하지 않습니다. 객체에는 이미 하나가 있습니다. 불변량의 위반은 다르게 취급됩니다. 새로운 개체가 처음부터 만들어지면 불변량 위반은 예외적으로 으로 끝납니다. 데이터베이스에서 다시 만든 개체로는이 작업을 수행 할 수 없습니다. 개체를 어떻게 든 복구해야하므로 기능을 수행 할 수 있습니다. 그렇지 않으면 데이터가 손실 될 수 있습니다.
대부분의 사람들은 도메인 모델에 동의하는 것처럼 보입니다. 그렇다면 도메인 계층에 공장이있는 곳은 어디입니까? 별도의 어셈블리, 폴더, 네임 스페이스? – retslig