Tôi đã tò mò về suy nghĩ của mọi người về việc giữ Id của một thực thể DAL như một thuộc tính của thực thể miền, tại thuộc tính chỉ đọc tuyệt đối.Các đối tượng Model và Domain Model Persistance
Suy nghĩ đầu tiên của tôi là điều này là ok nhưng tôi càng nghĩ về nó thì tôi càng không thích ý tưởng đó. Sau khi tất cả các mô hình miền là nghĩa vụ phải hoàn toàn không biết về cách dữ liệu được duy trì, và giữ và Id tài sản trên mỗi mô hình miền là một dấu hiệu ít hơn-tinh tế. Lớp kiên trì có thể là thứ không yêu cầu khóa chính hoặc một thuộc tính khác được hiển thị trong mô hình miền có thể là một ứng cử viên thích hợp để nhận dạng, một mô hình không. có lẽ. Nhưng sau đó tôi nghĩ, đối với các mô hình miền không có phương tiện đáng tin cậy để xác định duy nhất một mục trong lớp kiên trì cơ sở dữ liệu, làm cách nào để xác định các mục khi cập nhật hoặc xóa?
Từ điển dựa trên các khóa tham chiếu yếu có thể thực hiện thủ thuật; WeakDictionary<DomainEntity, PrimaryKeyType>
. Từ điển này sẽ là một phần của việc triển khai kho lưu trữ, bất cứ khi nào máy khách của kho lưu trữ Tìm nạp một bộ sưu tập của DomainEntity
một tham chiếu yếu đến thực thể và Id lưu giữ lâu bền của nó được lưu trữ trong từ điển nội bộ này. tổ chức vào kho để cập nhật lớp kiên trì, sau đây có thể được thực hiện để lấy lại id
PrimaryKeyType id = default(PrimaryKeyType);
if (!weakDictionary.TryGetValue(someDomainEntity, out id))
// id not found, throw exception? custom or otherwise..
// id found, continue happily mapping domain model back to data model.
những lợi ích của phương pháp này như tôi nhìn thấy nó, là đơn vị miền không cần duy trì id cụ thể lớp kiên trì của nó và kho lưu trữ buộc bạn phải có một thực thể miền hợp pháp thu được hoặc bằng một số cuộc gọi đến phương thức Fetch...
hoặc phương pháp Add/CreateNew
, e lse bạn nên cố gắng cập nhật/xóa các thực thể nó sẽ ném một ngoại lệ.
Tôi biết rằng điều này có lẽ quá kỹ thuật và tôi chỉ nên khóa xuống và thực dụng, tôi chỉ tò mò về những gì người khác nghĩ về điều này.
Tôi không muốn bắt đầu một chuỗi khác chỉ cho câu hỏi nhỏ này vì nó có phần liên quan. Nhưng vì gần đây tôi đã bắt đầu xem xét DDD (mặc dù trong trường hợp này cơ sở dữ liệu của tôi xuất hiện trước) Tôi tự hỏi liệu tôi có thể xác nhận rằng tôi có tư duy đúng đắn cho Thực thể miền hay không, đây là một ví dụ được cắt giảm về thực thể miền Nhân viên của tôi.
public class Employee : DomainEntity
{
public string FirstName { get; }
public string LastName { get; }
public UserGroup Group { get; }
// etc..
// only construct valid employees
public Employee(string firstName, string lastName, SecureString password, UserGroup group);
// validate, update. (not sure about this one.. pulled it
// from an open source project, I think that names should be able to be set individually).
AssignName(string firstName, string lastName);
// validate, update.
ResetPassword(SecureString oldPassword, SecureString newPassword);
// etc..
}
Cảm ơn bạn!
Bạn nên cắt giảm một chút về rác và hỏi một câu hỏi _real_ (không phải là một cuộc thảo luận) nếu bạn muốn câu hỏi này được trả lời (và vẫn mở) – Shoe
@ShoeMay: Tôi không đồng ý. Đây là một câu hỏi có liên quan và có cấu trúc tốt. Những khái niệm thực hiện DDD thường bị gánh nặng nặng nề bởi các câu hỏi thiết kế như thế này. – davenewza