6

Tôi đã tranh luận về điều này một thời gian và vẫn chưa đi đến kết luận. Trong khi hầu hết các ví dụ tôi thấy có mã nhà máy trong lớp ứng dụng, tôi có xu hướng nghĩ rằng nó phải nằm trong lớp miền. Lý do cho điều này: Tôi đôi khi có xác thực ban đầu được thực hiện tại nhà máy của tôi, nơi tôi muốn tất cả việc tạo ra các đối tượng phải trải qua. Tôi muốn mã này được sử dụng trên tất cả các instantiates của đối tượng của tôi. Đôi khi một thao tác yêu cầu thông tin tham số cảm thấy không tự nhiên để truyền cho một hàm tạo. Và một vài lý do khác không quan trọng.Mẫu nhà máy ở đâu nên có trong DDD?

Có lý do nào khiến đây là hành vi không tốt? Điều này có phá vỡ các mẫu khác không?

Trả lời

4

+1 để thực hiện điều đó. Khả năng truy cập sẽ là một lý do chính đáng, tôi sẽ giữ mã creational ít nhất gần với lớp mô hình miền. Nếu không, người dùng của mô hình miền sẽ chỉ đơn giản là nhầm lẫn làm thế nào để nhanh chóng nó đặc biệt khi tìm các nhà xây dựng truy cập bị hạn chế. Trên thực tế, một lý do âm thanh để tách nó sẽ là bạn có các cách hợp lệ khác nhau để tạo ra cùng một điều, ví dụ: đó là trường hợp thường khi sử dụng Nhà máy Tóm tắt.

Nếu tôi phải tách riêng, tôi sẽ đặt nó vào, ví dụ: một gói (trong trường hợp Java) ít nhất là cùng một mức của mô hình miền và gửi nó cùng với nó, ví dụ:

upper 
    --> domain 
    --> domain_factory 
+0

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

4

Từ bộ nhớ, sách của Eric Evans có các ví dụ về nơi các nhà máy đối tượng là một phần rất lớn của lớp miền.

Đối với tôi, nó có ý nghĩa hoàn hảo để xác định vị trí các nhà máy của bạn ở đây.

7

Một nhà máy trong DDD chỉ là một phiên bản của factory pattern và vì vậy nó nên được sử dụng ở nơi phù hợp nhất. Một nguyên tắc khác cần xem xét là mẫu information expert mà về cơ bản nói rằng hành vi nên được gán cho các lớp gần nhất với thông tin. Do đó, nếu bạn có một số quy tắc và logic cụ thể của miền mà bạn muốn thực thi, hãy đặt nhà máy trong lớp miền - sau khi tất cả, nhà máy tạo các đối tượng miền. Tuy nhiên, lưu ý rằng bạn có thể có các loại nhà máy khác ở các lớp khác.

0

Nếu nhà xây dựng/nhà máy chỉ có phụ thuộc vào lớp miền và nguyên thủy, hãy đặt chúng trong lớp miền, nếu không thì hãy đặt chúng bên ngoài lớp miền.

0

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.

Các vấn đề liên quan