Tôi đang cố gắng tìm hiểu sự tiêm phụ thuộc và gặp phải một vấn đề, khi đơn vị kiểm thử ứng dụng.Sự phụ thuộc của quá trình Tiêm phụ thuộc và thử nghiệm đơn vị
Tôi đang viết ứng dụng bảng điều khiển và vùng chứa được tạo và được khởi tạo trong Main(), có sẵn dưới dạng get-property
trong Program.Container
, vì vậy ở bất kỳ đâu trong ứng dụng của tôi, tôi có thể gọi Program.Container.Resolve<..>()
.
Tôi có một lớp ServiceValidator như thế này:
public class ServiceValidator
{
private readonly IConfiguration _configuration;
private readonly IService _service;
public ServiceValidator(IConfiguration configuration, IService service)
{
_configuration = configuration;
_service = service;
}
Trong lớp khác tôi sử dụng
ServiceValidator serviceValidator = Program.Container.Resolve<ServiceValidator>();
serviceValidator.VerifyVersion();
Đó là lời kêu gọi Program.Container.Resolve
gây cho tôi những vấn đề trong các thử nghiệm đơn vị, vì nó không có đã được thiết lập.
Thực tiễn không tốt, để gọi giải quyết trên vùng chứa phải không? Tôi có thể tạo ra các ServiceValidator dụ trong Main()
và vượt qua đối tượng xung quanh, nhưng điều đó có vẻ ngu ngốc vì nó sẽ gây ra rất nhiều tham số cho các đối tượng mà chỉ cần thông qua xung quanh để phương pháp tiếp theo.
Vì vậy, tôi đoán có thể chấp nhận gọi Resolve trong một lớp, nhưng sau đó vùng chứa phải được định cấu hình cho thử nghiệm đơn vị. Làm thế nào tôi nên làm điều đó, tôi nên di chuyển container đến một nơi khác hơn so với các lớp học chương trình? Bạn muốn giới thiệu gì?
Nếu vấn đề, tôi đang sử dụng Unity và C#
Cảm ơn :-)
> Khi bạn sử dụng tiêm phụ thuộc theo mọi cách, > thì bạn sẽ không cần truyền nhiều thông số cho các đối tượng. Tôi chưa bao giờ xem xét thực hiện DI cho tất cả các lớp học. Tôi chỉ muốn làm DI cho các lớp có sử dụng các công cụ bên ngoài, như dịch vụ web, cơ sở dữ liệu, có lẽ là cấu hình. Nếu tôi hiểu bạn đúng, bạn sẽ không bao giờ gọi giải quyết hay mới về bất cứ điều gì ngoài các lớp khung công tác? Cảm ơn câu trả lời của bạn :-) – Karsten
Đến để nghĩ về một điều khác. Nó có nghĩa là tất cả các vật thể được tạo ra phía trước, một thời gian dài trước khi chúng thực sự có thể cần thiết, có lẽ chúng thậm chí không cần thiết chút nào? – Karsten
Khi sử dụng DI tất cả các cách, bạn khởi động ứng dụng bằng cách lấy đối tượng gốc của ứng dụng từ vùng chứa DI, và sau đó bạn không còn truy cập trực tiếp vào vùng chứa. http://docs.google.com/Doc?id=dd2fhx4z_5df5hw8#xefn Các đối tượng sẽ được tạo khi một số đối tượng có chúng dưới dạng phụ thuộc được tạo. Nói chung, tất cả các đối tượng có cùng phạm vi vòng đời được khởi tạo cùng một lúc. Nếu một số đối tượng có phạm vi vòng đời khác nhau, thì bạn có thể tiêm một nhà máy để khởi tạo chúng vào đúng thời điểm. –