2010-01-20 31 views
7

Trong dự án máy chủ web với mô hình tên miền phong phú (logic ứng dụng nằm trong mô hình, không phải trong các dịch vụ), bạn xử lý việc tiêm các phụ thuộc vào các đối tượng mô hình như thế nào? Kinh nghiệm của bạn là gì?Làm thế nào để xử lý việc tiêm phụ thuộc vào các mô hình miền phong phú?

Bạn có sử dụng một số hình thức AOP không? Giống như chú thích @Configurable Springs? Thời gian tải hoặc xây dựng thời gian weawing? Các sự cố bạn gặp phải?

Bạn có sử dụng tính năng tiêm thủ công không? Sau đó, làm thế nào để bạn xử lý các kịch bản instantiation khác nhau (tạo các đối tượng thông qua một thư viện [như Hibernate], tạo các đối tượng với "new" ...)?

Hoặc bạn có sử dụng một số cách khác để tiêm phụ thuộc không?

+0

http://stackoverflow.com/questions/2091749/domain-driven-design-and-transactions-in-spring-environment – Bozho

Trả lời

2

Để giữ cho các đối tượng miền của tôi sạch sẽ, tôi tránh sử dụng cách tiêm trên các đối tượng/tập hợp/giá trị và đặt các đối tượng đó vào dịch vụ hoặc kho lưu trữ nếu cần.

Đối với điều này, chúng tôi đã sử dụng công cụ xây dựng Spring bình thường để dễ dàng kiểm tra.

Nếu bạn cần tiêm thứ gì đó vào thực thể, một đề xuất có thể là viết người xây dựng hoặc nhà máy và tiêm những gì bạn cần ở đó.

4

Chúng tôi sử dụng Spring's @Configurable (cùng với toán tử mới thông thường) hoạt động như một sự quyến rũ. Không còn nữa anemic domain models. Cuối cùng, đây là thiết kế hướng đối tượng nhiều hơn, không phải là:

Person person = new Person(firstname, lastname); 
// weird 
peopleService.save(person); 
// good (save is @Transactional) 
person.save(); 

Mail mail = new Mail(to, subject, body); 
// weird 
mailService.send(mail); 
// good (send is @Transactional) 
mail.send(); 

Chúng tôi chưa thực hiện bất kỳ so sánh hiệu suất nào. Cho đến nay, chúng tôi chỉ đơn giản là không cảm thấy cần phải làm như vậy.

EDIT: đó là cách lớp người sẽ trông như thế:

@Configurable("person") 
public class Person { 
    private IPersonDAO _personDAO; 
    private String _firstname; 
    private String _lastname; 

    // SNIP: some constructors, getters and setters 

    @Transactional(rollbackFor = DataAccessException.class) 
    public void save() { 
     _personDAO.save(this); 
    } 

    @Transactional(readOnly = true) 
    public List<Role> searchRoles(Company company) void{ 
     return _personDAO.searchRoles(this, company); 
    } 

    // it's getting more interesting for more complex methods 
    @Transactional(rollbackFor = DataAccessException.class) 
    public void resignAllRoles(Company company) { 
     for (Role role : searchRoles(company)) { 
      role.resign(); 
     } 
    } 
} 

// the implementation now looks like this 
personService.getPerson(id).resignAllRoles(company); 

// instead of this 
roleService.resignAll(personService.searchRoles(personService.getPerson(id), company)); 

Và đó là cấu hình mùa xuân:

<context:spring-configured /> 
<bean id="person" class="org.example.model.Person" lazy-init="true"> 
    <property name="personDAO" ref="personDAO" /> 
</bean> 

Lưu ý: như bạn thấy, vẫn còn có những dịch xung quanh, ví dụ để tìm kiếm các đối tượng (personService.getPerson (id)) nhưng tất cả các phương thức hoạt động trên một đối tượng được truyền (ví dụ: một người) được chuyển đến chính lớp đó (tức là person.save() thay cho personService.save (person)). Phương thức này vẫn giữ nguyên và làm việc với bất kỳ lớp truy cập dữ liệu cơ bản nào (JDBC thuần túy, Hibernate, JPA, ...). Nó chỉ đơn giản là di chuyển nơi nó thuộc về.

+0

Làm thế nào để bạn tồn tại các thực thể của bạn? JDBC đơn giản? Bởi vì chiến lược này sẽ không hoạt động nếu bạn sử dụng hibernate !? – Arne

+0

@Arne tất nhiên nó sẽ. xem chỉnh sửa của tôi để biết ví dụ. ý tưởng là bạn chỉ cần tiêm DAO vào các đối tượng miền. Các phương thức sau đó được chuyển từ các dịch vụ sang lớp (thường là tất cả các phương thức lấy đối tượng của lớp này làm đối số). Mọi thứ khác vẫn như cũ. – sfussenegger

+0

Nhưng nếu bạn đã có personId (ví dụ: bạn đang chỉnh sửa một người)? Sau đó, bạn có thể làm một cái gì đó như 'personService.getPerson (personId) .resignAllRoles (company);' hoặc 'roleService.resignAll (personService.searchRoles (personId, company));' Người đầu tiên có thể sẽ làm một truy vấn không cần thiết để có được đối tượng người. –

0

Bạn cũng có thể kiểm tra liên kết bên dưới, điều này có thể giúp ích rất nhiều.

Chế độ xem thực dụng về Kiến trúc phần mềm và Mô hình miền phong phú mô tả nơi mô hình Rich Domain Model và Kiến trúc phần mềm gặp nhau.

Hơn nữa nó mô tả làm thế nào để cấu hình, thực hiện và junit quan điểm này với sau kỹ thuật, các khuôn khổ và api:

  1. mùa xuân; để giúp nhà phát triển dễ dàng hơn trong cuộc sống
  2. JPA; cho Ánh xạ quan hệ đối tượng
  3. AspectJ; để trải nghiệm đầy đủ Mẫu tên miền phong phú
  4. JUnit; để thử nghiệm hội nhập của bạn Giàu Domain Model

http://www.ruimtefotografie.org/forum/viewtopic.php?f=32&t=193

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