Tôi đang học TDD. Tôi biết về tiêm phụ thuộc, theo đó bạn đặt các phụ thuộc của lớp trong các tham số của hàm tạo và chuyển chúng vào, đi qua trong các triển khai mặc định từ constructor mặc định ví dụ;Các lớp thử nghiệm đơn vị trong dự án web ASP.NET MVC có phải là một ví dụ hay không?
public AccountController() : this(RepositoryFactory.Users())
{
}
public AccountController(IUserRepository oUserRepository)
{
m_oUserRepository = oUserRepository;
}
RepositoryFactory là một lớp tĩnh đơn giản mà trả về triển khai lựa chọn cho việc xây dựng hiện hành
Nhưng mặc định ASP.NET MVC dự án ứng dụng web không làm điều này, thay vào đó là DI có dạng của công chúng các thuộc tính được gán trong bộ khởi tạo đối tượng trong lớp thử nghiệm ví dụ; từ AccountController.cs:
protected override void Initialize(RequestContext requestContext)
{
if (FormsService == null)
{ FormsService = new FormsAuthenticationService(); }
if (MembershipService == null)
{ MembershipService = new AccountMembershipService(); }
base.Initialize(requestContext);
}
Và trong AccountControllerTest.cs lớp thử nghiệm:
private static AccountController GetAccountController()
{
AccountController controller = new AccountController()
{
FormsService = new MockFormsAuthenticationService(),
MembershipService = new MockMembershipService(),
Url = new UrlHelper(requestContext),
};
//snip
}
Bây giờ lớp AccountController tôi có hai cách tiếp cận để Dependency Injection. Tôi nên sử dụng cái nào? Xây dựng tiêm hoặc tài sản công cộng?
Am nghĩ constructor tiêm ...
Việc sử dụng ASP.NET MVC tài sản công cộng như thế bởi vì bạn cần phải cung cấp một cách cụ thể của tiêm vào các nhà xây dựng, và cơ bản "tạo mới" ứng dụng web cần phải được chung chung như là một điểm khởi đầu?
Cảm ơn Mark, giờ đây đã có ý nghĩa.Có mơ hồ hay thuận tiện? Đối với bộ điều khiển tôi chỉ thấy hai công dụng (trong sự thiếu hiểu biết của tôi); ứng dụng đã biên dịch và dự án thử nghiệm. Ứng dụng được biên dịch chỉ sử dụng các triển khai mặc định từ hàm tạo mặc định. Điều đó sẽ nhanh hơn việc sử dụng một container IOC phải không? –
Ah ok Tôi nghĩ rằng tôi nhận được nó. Tôi đang đọc về IOC lồng nhau nơi phụ thuộc có phụ thuộc. Với IOC, điều này được giải quyết với một dòng đơn như IoC.Resolve(); –
Đánh dấu, bạn có thể giúp tôi hiểu rõ hơn lý do tại sao không sử dụng "Tiêm Bastard"? Như tôi thấy, lớp vẫn cho phép khớp nối lỏng lẻo trong đó bạn không phải sử dụng constrcutor mặc định. Phải thừa nhận rằng, mã có sự phụ thuộc tĩnh vào RepositoryFactory, nhưng bạn không phải sử dụng nó. Ngoài ra, "sự mơ hồ" là một tính năng: Sử dụng các phụ thuộc mặc định hoặc tự chèn của riêng bạn. Có chuyện gì vậy? –