2010-09-01 36 views
5

Đây có phải là thiết kế đối tượng hợp lệ không? Tôi có một đối tượng miền, nơi tôi tiêm một dịch vụ và gọi phương thức xác minh để cập nhật trạng thái của đối tượng và nếu mọi việc suôn sẻ gửi một thông báo xác nhận. Mã trông giống như:Đóng gói cuộc gọi dịch vụ trong một phương thức đối tượng miền

class Foo { 
    String bar 
    Service emailService 


    public boolean verify() { 
    bar = "foo" 
     if(this.save()) { 
      emailService.sendConfirmation() 
     } 
    } 
} 

Foo.get(1).verify() 

Có thể chấp nhận gọi dịch vụ emailService như vậy không? là có một mẫu thiết kế mà tôi có thể làm theo để sử dụng cho một tình huống như vậy.

Cảm ơn bạn - Ken

Trả lời

10

Không có gì sai với một dịch vụ gọi từ một thực thể là. Tuy nhiên, có một số vấn đề liên quan đến việc khởi tạo các dịch vụ này. Nếu bạn đi theo con đường này, bạn phải bằng cách nào đó có được một thể hiện của một dịch vụ trong quá trình tạo thực thể có vấn đề.

Gọi trực tiếp một nhà xây dựng rõ ràng là một ý tưởng tồi (vì nó kết hợp thực thể với việc triển khai dịch vụ).

Jimmy Bogard giải thích lý do tại sao injecting services into entities is a bad idea.

Thay vào đó, anh đề xuất sử dụng mẫu 'double dispatch' (có một số tranh luận nếu tên này là thích hợp) để giải quyết vấn đề này. Trong phương pháp này, một phương thức callee miền cung cấp dịch vụ triển khai thực hiện cho phương thức miền. Trong trường hợp của bạn, nó sẽ trông giống như thế:

class Foo { 
    String bar  

    public boolean verify(Service emailService) { 
    bar = "foo" 
     if(this.save()) { 
      emailService.sendConfirmation() 
     } 
    } 
} 

Foo.get(1).verify(new Service(...)) 

Tùy chọn cuối cùng (nhưng không kém) là sử dụng mẫu Sự kiện miền. Bạn có thể đọc về nó trên Udi Dahan's blog. Trong cách tiếp cận này, các thực thể chỉ chịu trách nhiệm xuất bản các sự kiện có ý nghĩa được đăng ký bởi các trình xử lý thích hợp. Bạn có thể đọc so sánh đầy đủ tất cả các kỹ thuật này on my blog.

Hy vọng rằng sẽ giúp

+0

Tôi sẽ nói rằng bạn nên mã hóa vào giao diện tại đây. Điều đó sẽ làm cho thực thể của bạn có thể kiểm tra và sẽ dễ dàng thay đổi dịch vụ nếu cần. ** xác minh bool công cộng (IConfirmationService emailService) ... ** –

+1

Tôi thích mẫu Sự kiện miền rất nhiều và thích đọc bài viết của Udi Dahan và hầu hết các nhận xét cũng như câu trả lời của họ cho họ. Tôi cũng có ý kiến ​​rằng kỹ thuật điều phối kép nên được sử dụng khi kỹ thuật sự kiện miền không giải quyết được vấn đề trong tầm tay.Bạn cũng chỉ ra về định vị dịch vụ mà tôi nghĩ rằng cá nhân là ác vì nó cho một cảm giác sai về đóng gói. Nó cũng làm cho thử nghiệm địa ngục. Cảm ơn bạn cho bạn những hiểu biết và câu trả lời. – ken

2

Tôi thường sẽ gửi xác nhận từ địa điểm (hành động?) Nơi xác minh sẽ được gọi. Nếu kết quả xác minh sẽ gửi nhiều email xác nhận thì có lẽ tôi sẽ có Foo tạo và trả lại ConfirmationMessage s (một đối tượng tên miền) sẽ đóng gói tất cả kiến ​​thức để xác nhận. Hành động sau đó sẽ có thể xếp hàng các tin nhắn này để gửi đi.

Có nói rằng, nếu Service của bạn là một Giao diện và bạn có thể tiêm giả để thử nghiệm và thực tế trên sản xuất, thì có vẻ tốt. Mặc dù tôi nghĩ tốt nhất là các đối tượng miền nắm giữ kiến ​​thức và logic về bản thân và không phải về các hệ thống (các dịch vụ) trong một lớp khác.

+0

+1 Đây là cách để đi vào DDD – Jehof

+0

+1 Xác minh đối tượng không liên quan gì đến việc gửi email. Và hãy tưởng tượng xác minh nhiều đối tượng trong một hoạt động hàng loạt - bạn sẽ gửi email cho mỗi đối tượng! –

+0

Sẽ không phải là một API lạ để có phương thức xác minh trả về một đối tượng ConfirmationMessage. Những gì một khách hàng API mong đợi là nếu hoạt động thành công hay không. Trong những gì bạn đang đề xuất, khi hoạt động xác minh thất bại, bạn sẽ trả về giá trị null? – ken

3

Điều tồi tệ về điều này là Bạn mất sự cô lập của mô hình miền của bạn. Mô hình miền của bạn biết về dịch vụ email là công cụ cơ sở hạ tầng thuần túy.

Có thể là một ý tưởng hay để giới thiệu dịch vụ ứng dụng. Mô hình tổ chức sự kiện cũng sẽ thực hiện thủ thuật.

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