2010-01-13 11 views
9

Khi giao dịch với các đối tượng yêu cầu dữ liệu chỉ được biết khi chạy, chẳng hạn như tên người dùng và mật khẩu, nơi cần phản đối sự kiện: bằng cách sử dụng mới, trong nhà máy hoặc trong vùng chứa DI?DI container, nhà máy, hoặc mới cho các vật thể tạm thời?

Ví dụ, tôi có thể chỉ new một đối tượng một lần tôi có dữ liệu:

UserCredentials creds = 
    new UserCredentials(dialog.getUsername(), dialog.getPassword()); 

Hoặc, tôi có thể sử dụng một nhà máy:

UserCredentials creds = 
    CredentialsFactory.create(dialog.getUsername(), dialog.getPassword()); 

Hoặc, tôi có thể sử dụng một nhà cung cấp trong vòng một DI container (trong trường hợp này về cơ bản sẽ là một nhà máy định hướng tham số). [Mã mẫu bị bỏ qua.]

Có vẻ như cả hai đều sai khi sử dụng vùng chứa DI cho một cái gì đó đơn giản như vậy nhưng dường như cũng không sai khi sử dụng nó đầy đủ nhất.

Trả lời

7

Như mọi khi, nó phụ thuộc, nhưng theo nguyên tắc chung, nhà máy tĩnh như tùy chọn thứ hai của bạn chỉ hiếm khi là ý tưởng hay.

new nhập đối tượng UserCredential có vẻ là lựa chọn hợp lý vì lớp UserCredentials trông giống như một lớp bê tông khép kín có thể được khởi tạo đầy đủ với tất cả các bất biến của nó từ tên người dùng và mật khẩu.

Trong các trường hợp khác, loại bạn muốn tạo có thể thể hiện bản thân trừu tượng. Nếu đúng như vậy, bạn không thể sử dụng từ khóa new, nhưng phải sử dụng một Nhà máy Tóm tắt Tóm tắt Nhà máy thay thế.

Sử dụng Nhà máy trừu tượng thường rất có giá trị vì nó cho phép bạn soạn một cá thể từ kết hợp các giá trị thời gian chạy và các phụ thuộc khác. Xem here để biết thêm thông tin.

Sử dụng một máy trừu tượng cũng giúp kiểm tra đơn vị vì bạn chỉ có thể kiểm tra xem giá trị trả về hoặc tiểu bang kết thúc hoặc bất cứ điều gì mà bạn quan tâm có liên quan đến đầu ra của Nhà máy Tóm tắt - cho phép bạn dễ dàng cung cấp một Kiểm tra đôi vì nó ... trừu tượng.

+0

Tôi thậm chí còn không ý thức về nhà máy tĩnh so với nhà máy trừu tượng. Cảm ơn bạn đã nhận xét về giá trị gia tăng trong lĩnh vực đó. –

0

Đối với tôi, tôi sử dụng DI để tạo khớp nối lỏng hơn giữa các đối tượng. Nếu phụ thuộc đối tượng của bạn bị ảnh hưởng bởi việc tạo một đối tượng bằng cách sử dụng mới, thì tôi không thấy lý do tại sao bạn không thể sử dụng DI hoặc tạo đối tượng relay cho một nhà máy. Điều này cho phép bạn kiểm soát nhiều hơn và giữ cho các lớp học của bạn được kết hợp với nhau.

Nó thực sự phụ thuộc vào thời gian và địa điểm bạn sẽ cần đối tượng này và nếu có sẽ phụ thuộc không cần thiết như là kết quả.

0

Nếu bạn đã thiết lập vùng chứa DI cho ứng dụng của mình, hãy sử dụng phương pháp này. Nếu không, hãy sử dụng phương pháp nhà máy.

2

Blog thử nghiệm google có a post which tries to answer this question. Ý tưởng cơ bản là bạn có thể phân loại từng lớp học của bạn là "có thể mới" hoặc "có thể tiêm" và rằng bạn chỉ có thể "mới" các bản mới.

tôi phân biệt 2 loại chính của "newables":

  • giá trị như int, string, DateTime, Etcetera.
  • đối tượng như Customer, Order, Employee, v.v. Tôi nghĩ rằng lớp học UserCredentials của bạn thuộc nhóm này.

Điều quan trọng là nhận ra rằng mới có thể có hành vi (có thể kiểm tra). Nếu bạn mắc sai lầm khi nghĩ rằng newables không nên có bất kỳ thử nghiệm hành vi hoặc đơn vị nào, bạn sẽ kết thúc với mẫu chống anemic domain model.

Một tác dụng phụ của việc có "newables" với hành vi là hành vi này không thể được abstracted đi trong các bài kiểm tra đơn vị của injectables của bạn. Điều này là OK; nó là bình thường để có một số khớp nối mạnh mẽ giữa mô hình miền của bạn và phần còn lại của ứng dụng của bạn.

Ngoài ra, newables được phép biết về injectables, nhưng họ chỉ hợp tác với họ thoáng qua. Ví dụ: UserCredentials không được tham số IUserDatabase làm đối số hàm tạo. Thay vào đó, có thể có phương thức UserCredentials.Verify(IUserDatabase).

chỉnh sửa: Tôi hiện không còn chắc chắn về những gì tôi đã viết ở trên. Các thực thể cũng có thể được xây dựng thông qua các nhà máy (có thể tiêm) thay vì gọi trực tiếp nhà xây dựng của họ. Việc thực hiện nhà máy sau đó có thể tiêm những thứ trong thực thể.

+0

Liên kết "mô hình miền thiếu máu" của bạn đề cập đến bài viết 'mới hoặc không mới'. –

+0

cảm ơn, hiện đã được khắc phục. –

+0

+1 đặc biệt là để cảnh báo về mô hình thiếu máu – NoxArt