Nếu tôi có một lớp cơ sở với các dịch vụ được tiêm thông qua các phụ thuộc của hàm dựng: Có thể khai báo hàm tạo của lớp con mà không sử dụng : base (params)
không?Tiêm phụ thuộc vào cả lớp cơ sở và phân lớp với IoC?
public MyBaseClass
{
private IServiceA _serviceA;
private IServiceB _serviceB;
private IServiceC _serviceC;
public MyBaseClass(null, null, null)
public MyBaseClass(IServiceA serviceA, IServiceB serviceB, IServiceC serviceC)
{
_serviceA = serviceA;
_serviceB = serviceB;
_serviceC = serviceC;
}
}
Và một lớp con với một số phụ thuộc thêm tiêm:
public MySubClassA : MyBaseClass
{
private IServiceD _serviceD;
public MySubClassA (null, null, null, null)
public MySubClassA (IServiceA serviceA, IServiceB serviceB,
IServiceC serviceC, IServiceD serviceD)
: base (serviceA, serviceB, serviceC)
{
_serviceD = serviceD;
}
}
Vấn đề ở đây là tôi có nhiều lớp con, chỉ có 10 hoặc lâu hơn ngay bây giờ, nhưng số lượng sẽ tăng lên. Mỗi khi tôi cần thêm một phụ thuộc khác vào lớp cơ sở, tôi phải đi qua từng lớp con và tự thêm phụ thuộc vào đó. Công việc thủ công này khiến tôi nghĩ rằng có điều gì đó sai trái với thiết kế của tôi.
Vì vậy, có thể khai báo hàm tạo của MyBaseClassA
mà không có các dịch vụ theo yêu cầu của lớp cơ sở trong hàm tạo của lớp con không? ví dụ để các nhà xây dựng của MyBaseClassA
chỉ có mã này đơn giản hơn nhiều:
public MySubClassA (null)
public MySubClassA (IServiceD serviceD)
{
_serviceD = serviceD;
}
gì tôi cần phải thay đổi trong lớp cơ sở để các dependency injection xảy ra ở đó và không cần phải được bổ sung vào các lớp học phụ như tốt? Tôi đang sử dụng LightInject IoC.
Không thể thùng chứa IoC của bạn tiêm vào các thuộc tính thay vì hàm tạo? Tôi nghĩ rằng nó sẽ đơn giản hơn nhiều, đặc biệt là nếu bạn là các lớp lồng nhau sâu và rất nhiều tiêm. –
Ngoài ý tưởng khác của Simon .. bạn có thể ném một wrapper xung quanh những phụ thuộc này (một container phụ thuộc, nếu bạn sẽ) như một giải pháp khác. Mặc dù tôi thích cách tiếp cận tài sản. –
@SimonBelanger mọi thứ khác trong ứng dụng sử dụng tiêm tham số. Tôi nghĩ rằng tiêm tài sản đã được thử trong một phần của ứng dụng và đã có một số vấn đề mà tôi đã quên - tôi sẽ phải xem lại nó. –