7

Tôi đã nghiên cứu kiến ​​trúc hành tây trong một vài ngày. Tôi hiểu rằng các phụ thuộc nên luôn đi về phía trung tâm và cách sử dụng tiêm phụ thuộc để thực hiện điều này. Nhưng tôi có một vài câu hỏi mà tôi vẫn không thể hiểu được.cách triển khai dịch vụ và kho lưu trữ trên kiến ​​trúc hành tây?

  1. Mô hình (hoặc tổ chức) có thể tham chiếu giao diện lưu trữ hoặc giao diện dịch vụ không?

    Ví dụ: một thực thể Order có một mối quan hệ DeliveryCity thiết lập thông qua Oder.DeliveryZip bất động sản, đó là không một chìa khóa nước ngoài, nhưng là duy nhất. Để có được thành phố cho một zip, tôi phải gọi ICityRepository.FindByZip(zip)

    Tôi có đoạn mã sau vào mô hình của tôi

    class Order 
    { 
        . . . 
    
        [Inject] 
        public ICityRepository CityRepository { get; set; } 
    
        private City _dCity; 
    
        public City DeliveryCity { 
         get { 
          if (_dCity == null) 
           _dCity = this.CityRepository.FindByZip(this.DeliveryZip); 
    
          return _dCity; 
         } 
        } 
        . . . 
    } 
    
  2. Điều gì sẽ là những vấn đề của các mã trên? Có nên sử dụng dịch vụ miền thay thế không?

  3. Việc triển khai dịch vụ miền có được xác định bên trong lõi hay ở lớp cơ sở hạ tầng không?

Trả lời

5

Đây là nơi các nhà máy phù hợp với miền. Một OrderFactory có thể nhận các phụ thuộc, chẳng hạn như một sự phụ thuộc vào IOrderRepository cũng như sự phụ thuộc vào ICityRepository. Khi nhà máy được sử dụng để tạo (hoặc reconstitute) một thực thể Order, nhà máy có thể tra cứu thành phố và thiết lập thuộc tính Order cho phù hợp. Hoặc, như herzmeister đề nghị, đặt nó bằng cách sử dụng Lazy nên tra cứu chỉ được thực hiện nếu/khi cần thiết.

+0

Nó có ý nghĩa hoàn hảo! Tôi tự hỏi mình "làm thế nào tôi có thể bỏ lỡ điều đó?" Cảm ơn! – svallory

+1

Đây là một sai lầm. Nhà máy DDD không chịu trách nhiệm cho việc hoàn nguyên. Reconitution là cuộc sống trung lưu của một đối tượng, Nhà máy chỉ quan tâm đến sự khởi đầu của cuộc sống. Vui lòng xem câu trả lời này: http://stackoverflow.com/a/10264669/625332 – Dmitry

+0

Tôi không đồng ý. Các nhà máy được sử dụng để tạo ra các cá thể của một đối tượng. Chúng có thể là lúc bắt đầu vòng đời của một vật thể hoặc được sử dụng để pha chế. Họ có thể cùng lớp với hai phương pháp hoặc hai lớp khác nhau. Dù bằng cách nào, tôi đồng ý rằng có sự khác biệt về cách thức hoạt động của nhà máy trong từng trường hợp. Tôi thường có nhà máy tái tạo như một sự phụ thuộc của kho lưu trữ mà đại diện cho nhà máy để tạo và reconstitute trường hợp mới với dữ liệu được lấy từ kho dữ liệu. Để biết thêm thông tin, xem Evans pg 145: "Reconstituting Stored Objects" – SonOfPirate

5

Điều gì sẽ là vấn đề của mã trên? Có nên sử dụng dịch vụ miền thay thế không?

Hai điều cần xem xét ở đây:

  1. ICityRepository không phải là một sự phụ thuộc thực sự cho thứ tự, nói cách khác theo thứ tự không cần nó cho các phương pháp khác của nó. Sự phụ thuộc thực sự là một cái gì đó mà đối tượng không thể làm việc mà không có. Vì vậy, bạn có thể xem xét chuyển nó như một tham số cho phương thức như 'GetDeliveryCity' (xem this để biết chi tiết).

  2. Tìm thành phố theo mã zip có vẻ không phải là trách nhiệm của đơn hàng. Đối với Đơn đặt hàng là cohesive, nó chỉ phải đối phó với chức năng liên quan đến đơn đặt hàng. Bạn có thể muốn lấy chức năng này ra khỏi lớp thứ tự.

việc triển khai dịch vụ miền nên được định nghĩa bên trong lõi hoặc tại lớp cơ sở hạ tầng?

Bên trong lõi nếu đây thực sự là dịch vụ miền (không phải dịch vụ ứng dụng).

0
  1. Làm thế nào về

    private Lazy<City> _dCityLazy; 
    
    public City DeliveryCity { 
        get { 
         return _dCityLazy.Value; 
        } 
    } 
    

    nơi bạn muốn tiêm Lazy<City> bởi một số cơ chế?

  2. Bạn sẽ quyết định linh hoạt bằng cách tiêm từ bên ngoài vào trong ví dụ này.

  3. Tôi muốn nói điều đó thực sự phụ thuộc vào dịch vụ tên miền cụ thể và nơi nó được sử dụng.

+0

Tiêm thành phố thông qua một IoC sẽ dẫn đến việc thêm quy tắc kinh doanh vào bộ phun phụ thuộc, điều này thực sự rất tệ. Tôi không chắc đó là những gì bạn đề nghị thouhg. – svallory

+0

Tất nhiên quy tắc kinh doanh trong bộ phun phụ thuộc thực sự là xấu, nhưng nó không phải như vậy. Có nhiều khả năng khác. Có thể có một dịch vụ miền ở giữa. Hoặc, tìm kiếm id đơn giản rõ ràng là công việc của một kho lưu trữ, mang theo phương thức thực tế từ nơi đại biểu cho 'Lazy ' sẽ được tham chiếu. Nói chung, tôi chỉ muốn giữ các thực thể của mình đơn giản, tức là không có bất kỳ kiến ​​thức nào về cấu trúc của sự kiên trì thực sự, tức là không có bất kỳ tham chiếu nào đến các dịch vụ hoặc kho lưu trữ. – herzmeister

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