Tôi xin lỗi nếu điều này có vẻ như là một câu hỏi lặp lại, nhưng mỗi lần tôi tìm thấy một bài viết liên quan đến chủ đề này, nó chủ yếu chỉ nói về DI là gì. Vì vậy, tôi nhận được DI, nhưng tôi đang cố gắng tìm hiểu sự cần thiết của một container IoC, thứ mà mọi người dường như đang tham gia. Là điểm của một container IoC thực sự chỉ để "tự động giải quyết" việc triển khai cụ thể các phụ thuộc? Có thể các lớp học của tôi có xu hướng không có một số phụ thuộc và có thể đó là lý do tại sao tôi không thấy vấn đề lớn, nhưng tôi muốn chắc chắn rằng tôi hiểu chính xác tiện ích của container.
Tôi thường phá vỡ logic kinh doanh của mình thành một lớp có thể trông giống như thế này:
public class SomeBusinessOperation
{
private readonly IDataRepository _repository;
public SomeBusinessOperation(IDataRespository repository = null)
{
_repository = repository ?? new ConcreteRepository();
}
public SomeType Run(SomeRequestType request)
{
// do work...
var results = _repository.GetThings(request);
return results;
}
}
Vì vậy, nó chỉ có một phụ thuộc và trong một số trường hợp, nó có thể có lần thứ hai hoặc thứ ba, nhưng không thường xuyên. Vì vậy, bất cứ điều gì gọi điều này đều có thể vượt qua repo của chính nó hoặc cho phép nó sử dụng repo mặc định.
Theo như sự hiểu biết hiện tại của tôi về một container IoC, tất cả các container thực hiện là giải quyết IDataRep repository. Nhưng nếu đó là tất cả, thì tôi không thấy một tấn giá trị nào trong đó vì các lớp hoạt động của tôi đã xác định dự phòng khi không có sự phụ thuộc nào được đưa vào. Vì vậy, lợi ích duy nhất khác tôi có thể nghĩ đến là nếu tôi có một vài hoạt động như cái này sử dụng cùng một repo dự phòng, tôi có thể thay đổi repo đó ở một nơi là registry / nhà máy / container. Và điều đó thật tuyệt, nhưng phải vậy không?
ConcreteRepository
và (2) bạn có thể cung cấp các phụ thuộc bổ sung cho ConcreteRepository
(ví dụ: kết nối cơ sở dữ liệu sẽ phổ biến).