2012-02-25 35 views
22

Tôi đã nhận thấy rằng rất nhiều nhà phát triển xác định giao diện cho lớp học EVERY sẽ được tiêm bằng khung DI. Ưu điểm của việc xác định Giao diện cho mọi lớp là gì?Dependency Injection & sử dụng giao diện?

+4

Tại sao lại gần? Làm thế nào về mất thời gian và để lại một bình luận? – aryaxt

+0

-1 Xem các câu hỏi thường gặp "Tôi có thể hỏi những câu hỏi nào ở đây?" và "Tôi không nên hỏi những câu hỏi nào ở đây". Họ là hai người đầu tiên trong danh sách. –

+1

Câu hỏi của bạn là câu hỏi hợp lý và thú vị, nhưng nó hơi mơ hồ và không cụ thể (ví dụ không có mã), đó là lý do tại sao mọi người downvoted nó và bỏ phiếu nó được đóng lại. – Steven

Trả lời

16

Cho thành phần ứng dụng của bạn (các lớp có chứa các logic ứng dụng) thực hiện một giao diện rất quan trọng, vì đây đẩy mạnh các khái niệm về:

Chương trình để một giao diện, không phải là một thực hiện.

Đây là hiệu quả là Dependency Inversion Principle. Làm như vậy cho phép bạn thay thế, chặn hoặc trang trí các phụ thuộc mà không cần phải thay đổi người tiêu dùng phụ thuộc như vậy.

Trong nhiều trường hợp, các nhà phát triển sẽ vi phạm các nguyên tắc SOLID tuy nhiên khi có một ánh xạ gần như một-một giữa các lớp và một giao diện. Một trong những nguyên tắc gần như chắc chắn bị vi phạm là Open/closed principle, bởi vì khi mỗi lớp có giao diện riêng của nó, không thể mở rộng (trang trí) một tập hợp các lớp với các mối quan tâm xuyên suốt (không có thủ thuật tạo proxy động).

Trong các hệ thống tôi viết, tôi xác định hai giao diện chung bao trùm phần lớn mã của lớp doanh nghiệp. Họ được gọi là ICommandHandler<TCommand> và một IQueryHandler<TQuery, TResult>:

public interface ICommandHandler<TCommand> 
{ 
    void Handle(TCommand command); 
} 

public interface IQueryHandler<TQuery, TResult> where TQuery : IQuery<TResult> 
{ 
    TResult Handle(TQuery query); 
} 

Bên cạnh những tác dụng phụ tốt đẹp của không cần phải xác định nhiều giao diện, điều này cho phép linh hoạt tuyệt vời và dễ kiểm tra. Bạn có thể đọc thêm về nó herehere.

Tùy thuộc vào hệ thống tôi viết, tôi cũng có thể sử dụng giao diện như:

  • IValidator<T> để phê chuẩn thông điệp
  • ISecurityValidator<T> để áp dụng hạn chế bảo mật trên các thông điệp
  • IRepository<T>, mô hình kho
  • IAuthorizationFilter<T> để áp dụng lọc ủy quyền/bảo mật theo số IQueryable<T> truy vấn.

Tùy thuộc vào hệ thống tôi viết, ở đâu đó giữa 80% và 98% tiền thân của tất cả các thành phần thực hiện một trong các giao diện chung này tôi xác định. Điều này làm cho việc áp dụng mối quan tâm xuyên suốt cho những người được gọi là joinpoints tầm thường.

2

blog entry này có rất nhiều câu trả lời bạn đang tìm kiếm: http://benpryor.com/blog/2006/08/23/java-advantages-of-interfaces/

Nếu bạn không thiết kế giao diện, bạn sẽ được hamstrung khi nói đến thời gian để cấu trúc lại mã của bạn và/hoặc thêm các cải tiến. Sử dụng một khung công tác DI không thực sự là vấn đề khi nói đến việc thiết kế một giao diện. Những gì DI cung cấp cho bạn là ràng buộc muộn và khả năng viết bài kiểm tra đơn vị tốt hơn nhiều.

+0

nó nói rằng trang không tìm thấy.! vui lòng cập nhật –

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