11

Ví dụ:Có thích hợp để sử dụng Property Injection trong một lớp cơ sở khi phụ thuộc chỉ được yêu cầu trong lớp cơ sở?

public abstract class BaseControler : Controller 
{ 
    public IUnitOfWork UnitOfWork { get; set; } 
} 

public class HomeController : BaseControler 
{ 
    readonly IUserRepository _userRepository; 

    // :-) 
    public HomeController(IUserRepository userRepository) 
    { 
     _userRepository = userRepository; 
    } 
} 

Chúng ta đều biết rằng chúng ta phải sử dụng Constructor tiêm khi phụ thuộc là yêu cầu. Nếu đó là phụ thuộc tùy chọn, chúng tôi có thể sử dụng Tiêm thuộc tính thay thế.

Nhưng bạn nên làm gì khi chỉ có lớp cơ sở của bạn yêu cầu sự phụ thuộc?

Khi bạn sử dụng Constructor Injection, bạn sẽ theo ý kiến ​​của tôi gây ô nhiễm tất cả các lớp dẫn xuất.

public abstract class BaseControler : Controller 
{ 
    readonly IUnitOfWork _unitOfWork; 

    public BaseControler(IUnitOfWork unitOfWork) 
    { 
     _unitOfWork = unitOfWork; 
    } 
} 

public class HomeController : BaseControler 
{ 
    readonly IUserRepository _userRepository; 

    // :-(
    public HomeController(IUserRepository userRepository, 
     IUnitOfWork unitOfWork) : base(unitOfWork) 
    { 
     _userRepository = userRepository; 
    } 
} 

Có approperiate sử dụng tiêm tài sản trong một lớp cơ sở khi một phụ thuộc chỉ được yêu cầu trong các lớp cơ sở?

Trả lời

12

Bạn không gây ô nhiễm cho lớp dẫn xuất. Bạn đang nói rõ với người tiêu dùng rằng lớp này không thể hoạt động mà không có sự phụ thuộc này.

Nếu lớp cơ sở yêu cầu sự phụ thuộc này để hoạt động chính xác, vì lớp dẫn xuất xuất phát từ lớp cơ sở này, nó ngầm đòi hỏi sự phụ thuộc này. Vì vậy, ví dụ thứ hai là cách chính xác. Bạn không nên sử dụng tiêm tài sản cho một cái gì đó là một phụ thuộc cần thiết.

+0

Tôi thấy điểm của bạn, nhưng vấn đề tôi sẽ nhận được là rất nhiều tham số hàm tạo. Vấn đề là các lớp dẫn xuất không nói trực tiếp với sự phụ thuộc, thay vì lớp cơ sở. Vì vậy, tôi sẽ phân biệt giữa các cuộc gọi trực tiếp đến một sự phụ thuộc và các cuộc gọi gián tiếp đến một sự phụ thuộc. – Rookian

+0

@Rookian, nếu bạn gặp phải tình huống mà bạn đang có nhiều tham số hàm tạo, bạn có thể xem xét việc tạo một dịch vụ sẽ tổng hợp các phụ thuộc đó và sau đó chỉ tiêm dịch vụ vào hàm tạo. –

+5

+1 Thành phần ưu tiên hơn thừa kế. Nếu nó trở thành một vấn đề với quá nhiều tham số constructor, đổ lỗi cho chiến lược thừa kế của bạn, không phải là Constructor Injection. –

3

Thực ra lớp dẫn xuất của bạn là lớp cơ sở. Không có đối tượng nào khác ở đâu đó. Khi bạn truyền một cái gì đó cho hàm tạo cơ sở, bạn thực sự khởi tạo cùng một đối tượng. Và nó hiển thị cho khách hàng những gì thể hiện của bạn phụ thuộc vào:

Có MỘT trường hợp, phụ thuộc vào hai điều: kho lưu trữ người dùng và đơn vị công việc. Gọi hàm tạo lớp cơ sở chỉ loại bỏ trùng lặp khởi tạo từ các lớp dẫn xuất của bạn.

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