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ở?
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
@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. –
+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. –