2013-07-01 32 views
6

Làm cách nào để cấp quyền truy cập cho cài đặt được định cấu hình cho người dùng trong DDD?DDD và cấu hình

Chúng tôi có một cơ sở dữ liệu cấu hình lưu trữ các mục dưới dạng một loạt các cặp khóa-giá trị. Điều này dường như không phù hợp với mẫu kho lưu trữ, vì vậy làm cách nào để cho phép người dùng truy cập vào các giá trị cấu hình này?

Lý tưởng nhất là tôi muốn có các lớp riêng biệt cho các nhóm cấu hình khác nhau, ví dụ: BillingSettings, ReportSettings, TaxSettings.

Có vẻ như kỳ lạ khi cung cấp một kho lưu trữ riêng biệt cho từng loại này, nhưng tôi cũng muốn duy trì sự thiếu hiểu biết liên tục cho các lớp cài đặt này.

Cách chính xác để bật quyền truy cập vào cấu hình trong DDD là gì?

Trả lời

1

Điều tôi thường làm là chỉ trừu tượng cấu hình bằng giao diện, ví dụ: IBillingConfiguration, IReportConfiguration, v.v. Việc triển khai những điều này sau đó được chuyển đến các phương pháp có liên quan (hoặc được tiêm vào các đối tượng liên quan).

Trường hợp giá trị đến từ đó thực sự không quan trọng. Có lần khi tôi sử dụng một kho lưu trữ khi lưu trữ các giá trị trong một cơ sở dữ liệu và sau đó tôi muốn có một cái gì đó như IConfigurationPropertyRepository. Đó là một phần của một sự phù hợp vụng về kể từ khi một ConfiruationProperty không hoàn toàn cảm thấy như một công dân hạng nhất trong thế giới thực thể nhưng nó dường như để có được công việc làm.

Tôi sẽ trả lại một số thực hiện IBillingConfiguration chỉ nhận được thuộc tính bắt buộc từ bộ sưu tập cơ bản hoặc ConfigurationProperty đối tượng.

Phương thức GetSave liên quan cho mỗi I{Some}Configuration sẽ được triển khai trên ConfigurationPropertyRepository để tôi chỉ nhận/lưu tập hợp con thuộc tính cần được áp dụng.

0

Thanh toán có thực sự là tổng hợp (hoặc thậm chí đối tượng tên miền) trong các mô hình miền của bạn không? Nếu không, nó không nên có một kho lưu trữ tương ứng.

Hầu hết các cấu hình đều là cơ sở hạ tầng cụ thể, chẳng hạn như url jdbc, mật khẩu, v.v. Bạn không phải đối phó với họ theo cách của DDD. Chúng tôi có thể cần một hoạt động CRUD hỗ trợ ConfigurationService nếu cài đặt được lưu trữ trong cơ sở dữ liệu và được phép sửa đổi bởi người dùng trong thời gian chạy. Nhưng ConfigurationService không thuộc về miền và bối cảnh giới hạn đặt hàng này, nó chỉ là một dịch vụ cơ sở hạ tầng. Chúng ta không phải phát triển nó theo cách DDD.

Cập nhật nhận xét của @Kristof Jozsa.

Cài đặt được sử dụng để hỗ trợ khái niệm miền. Khái niệm miền là trừu tượng và cách truy cập cài đặt là chi tiết triển khai.

class ExpirationSpecification { 
    private int days 
    //other settings?   

    public ExpirationSpecification(int days) {...} 

    public boolean isSatisfied(Order order) {...} 
} 

public class ExpirationServiceImpl implements ExpirationService { 
    //private int days;//inject using placeholder in spring 
    private ConfigurationService configService;//if settings are stored in database 

    ExpirationSpecification spec() { 
     //return new ExpirationSpecification(days); 
     return new ExpirationSpecification(configService.orderExpirationDays()); 
    } 

    void cancel(Order order) {...} 
} 
+1

vấn đề là có nhiều giá trị cấu hình dành riêng cho doanh nghiệp - để cung cấp cho bạn ví dụ về cụm từ doanh nghiệp "hết hạn" và giá trị có thể định cấu hình cho ví dụ này. trong ngày? Kiểm tra hết hạn phải là một phần của miền nhưng bạn cũng cần có được giá trị cấu hình trong đó. –

+0

Tôi đồng ý :). Và tôi thích coi nó như một khái niệm miền. Trong ví dụ của bạn, tôi sẽ có một OrderExpirationSpecification có thể được trả về bởi một dịch vụ miền. Trong bối cảnh giới hạn này, nó là một trừu tượng. Làm thế nào để có được những ngày là một mối quan tâm cơ sở hạ tầng. Hơn nữa, có thể yêu cầu quản trị viên phải có khả năng thay đổi ngày trong thời gian chạy, nhưng tôi nghĩ rằng hoạt động CRUD nên được chia thành ngữ cảnh bị chặn khác. – Hippoom

+0

okay .. Tôi chỉ thấy một vấn đề triển khai ở đây bằng ví dụ. Mùa xuân hoặc nền tảng JEE .. bất kỳ gợi ý nào bạn sẽ tiếp cận điều này? –

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