Tôi thích các Nhà máy trong Lớp ứng dụng.
Nếu bạn giữ cho nhà máy trong Layer Domain, họ sẽ không giúp bạn khi bạn cần loại phức tạp như các thông số (C# mã ví dụ):
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...
Ngoài ra, không có nghĩa vụ giữ nhà máy bên trong miền layer (từ Domain Driven Design Quickly):
Do đó, chuyển trách nhiệm cho việc tạo ra các trường hợp phức tạp đối tượng và uẩn đến một đối tượng riêng biệt, mà thể bản thân có không tái tài trợ trong mô hình miền nhưng vẫn là vẫn là một phần của thiết kế tên miền . Cung cấp một giao diện đóng gói tất cả các assembly phức tạp và không yêu cầu client tham chiếu các lớp cụ thể của các đối tượng được khởi tạo.Tạo toàn bộ Tổng hợp làm đơn vị, thực thi các bất biến của chúng.
Vì tôi không sử dụng các Nhà máy để tải các đối tượng liên tục vào bộ nhớ, chúng không cần phải truy cập từ các lớp khác ngoài ứng dụng. Dưới đây là lý do tại sao (từ Domain Driven Design Quickly):
quan sát khác là nhà máy cần phải tạo ra các đối tượng mới từ đầu, hoặc họ được yêu cầu để pha đối tượng mà tồn tại trước đó, nhưng đã có thể vẫn kiên trì đến một cơ sở dữ liệu . Đưa các thực thể trở lại bộ nhớ từ vị trí nghỉ của chúng trong cơ sở dữ liệu liên quan đến quá trình hoàn toàn khác với việc tạo mới. Một sự khác biệt rõ ràng là đối tượng mới không cần danh tính mới. Đối tượng đã có một. Vi phạm các bất biến được xử lý khác nhau. Khi đối tượng mới được tạo từ đầu, mọi vi phạm bất biến sẽ kết thúc bằng trong trường hợp ngoại lệ. Chúng tôi không thể làm điều đó với các đối tượng được tạo lại từ một cơ sở dữ liệu. Các đối tượng cần phải được sửa chữa bằng cách nào đó, vì vậy chúng có thể hoạt động, nếu không có mất dữ liệu.
Dường như hầu hết mọi người đồng ý với nó nằm trong mô hình miền. vậy thì bạn đề xuất nhà máy của mình ở đâu trong lớp Miền? Một không gian tên, lắp ráp, thư mục riêng biệt? – retslig