私はアプリケーション層のファクトを優先します。
あなたがドメイン・レイヤーで工場を続ける場合は、パラメータ(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から)ドメイン層:したがって
、別のオブジェクトに複雑 オブジェクトと集計のインスタンスを作成するための責任をシフト、自体が ない再を有していてもよいですドメインモデルでのスポンサシティーは、まだ ドメインデザインの一部です。すべての複合 アセンブリをカプセル化し、クライアントがインスタンス化されるオブジェクトの具象クラスを参照する必要のないインターフェイスを提供します。 全体を1単位として作成し、不変量を適用します。
私は、永続オブジェクトをメモリに読み込むためにファクトリを使用しないため、アプリケーションのものよりも他のレイヤからアクセスする必要はありません。ここでは、なぜ(Domain Driven Design Quicklyから)です:
別の観察は、工場が最初から新しいオブジェクト を作成する必要があるということである、またはそれらは 以前に存在し、おそらく データベースに永続化されたオブジェクトを再構成するために必要とされています。 エンティティをデータベース内の残りの 場所からメモリに戻すと、 という新しいプロセスが作成されます。が新しく作成されます。明らかな違いの1つは、新しい オブジェクトに新しいIDが必要ないことです。オブジェクトには既に1つあります。 不変量の違反は、異なる方法で処理されます。 新しい オブジェクトが最初から作成されると、不変量の違反はすべて を例外として終了します。私たちは データベースから再作成されたオブジェクトではそれを行うことはできません。オブジェクトは何とか修復する必要がありますので、 は機能する可能性があります。それ以外の場合はデータが失われます。
ほとんどの人がドメインモデルに参加しているようです。それで、あなたの工場はドメイン層にどこに存在することをお勧めしますか?別のアセンブリ、フォルダ、名前空間? – retslig