私はアプリケーション層のファクトリを好みます。
ファクトリをドメインレイヤーに保持している場合、パラメータとして複雑な型が必要な場合は役に立ちません(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...
また、ファクトリーをドメインレイヤー内に保持する義務はありません(ドメイン駆動設計から):
したがって、複雑なオブジェクトとアグリゲートのインスタンスを作成する責任を別のオブジェクトに移します。このオブジェクト自体はドメインモデルでは責任を負わない場合がありますが、それでもドメイン設計の一部です。すべての複雑なアセンブリをカプセル化し、インスタンス化されるオブジェクトの具象クラスをクライアントが参照する必要がないインターフェイスを提供します。アグリゲート全体を1つのユニットとして作成し、それらの不変条件を適用します。
永続化されたオブジェクトをメモリにロードするためにファクトリを使用しないため、アプリケーション以外のレイヤーからアクセスできる必要はありません。理由は次のとおりです(ドメイン駆動設計からすばやく):
もう1つの観察結果は、ファクトリが新しいオブジェクトを最初から作成する必要があるか、以前は存在していたがデータベースに永続化されている可能性のあるオブジェクトを再構成する必要があるということです。エンティティをデータベース内の休止場所からメモリに戻すには、新しいエンティティを作成するプロセスとはまったく異なるプロセスが必要です。明らかな違いの1つは、新しいオブジェクトが新しいIDを必要としないことです。オブジェクトにはすでに1つあります。不変条件の違反は異なる方法で処理されます。新しいオブジェクトを最初から作成すると、不変条件の違反は例外になります。データベースから再作成されたオブジェクトではそれを行うことはできません。オブジェクトは何らかの方法で修復する必要があるため、機能させることができます。そうしないと、データが失われます。