6

Tôi có một trình trợ giúp thẻ với nhiều hàm tạo trong ứng dụng ASP.NET 5 của tôi. Điều này gây ra lỗi sau khi chạy khi ASP.NET 5 cố gắng giải quyết loại:ASP.NET 5 MVC 6 Dependency Injection với nhiều Constructors

InvalidOperationException: Nhiều nhà thầu chấp nhận tất cả các loại đối số đã cho được tìm thấy trong loại 'MyNameSpace.MyTagHelper'. Chỉ nên có một nhà xây dựng được áp dụng.

Một trong các hàm tạo là tham số và trường còn lại có một số đối số có tham số không phải là loại đã đăng ký. Tôi muốn nó sử dụng constructor parameterless.

Có cách nào để tải khung công tác phụ thuộc ASP.NET 5 để chọn một hàm tạo cụ thể không? Thông thường điều này được thực hiện thông qua việc sử dụng một thuộc tính nhưng tôi không thể tìm thấy bất cứ điều gì.

Trường hợp sử dụng của tôi là tôi đang cố tạo một lớp duy nhất vừa là TagHelper, vừa là trình trợ giúp HTML hoàn toàn có thể nếu vấn đề này được giải quyết.

+4

Thuốc tiêm của bạn chỉ nên có một hàm tạo. Có [nhiều nhà xây dựng là một mẫu chống] (https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=97). – Steven

+0

Vâng, nó không lý tưởng. Tôi sẽ nghĩ ra một công việc. –

+0

Nếu bạn đọc [bài báo] (https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=97) hoàn toàn, bạn sẽ thấy câu trả lời rất đơn giản. Trong trường hợp loại bạn kiểm soát: hãy xóa một hàm tạo. Nếu 'MyTagHelper' này là một kiểu bên thứ ba hoặc khung công tác, hãy đăng ký nó bằng cách sử dụng một đại biểu nhà máy và gọi hàm tạo cụ thể bên trong ủy nhiệm đó. – Steven

Trả lời

9

Illya là đúng: được xây dựng trong phân giải không hỗ trợ loại phơi bày nhiều nhà xây dựng ... nhưng không có gì ngăn cản bạn từ việc đăng ký một đại biểu ủng hộ kịch bản này:

services.AddScoped<IService>(provider => { 
    var dependency = provider.GetRequiredService<IDependency>(); 

    // You can select the constructor you want here. 
    return new Service(dependency, "my string parameter"); 
}); 
+0

Cảm ơn, điều này rất hữu ích cho việc kết nối các thư viện của bên thứ ba mà tôi không kiểm soát. – SimonGates

1

Câu trả lời của ASP.NET lõi 1.0

Các câu trả lời khác vẫn đúng đối với paramet các hàm tạo ít er nghĩa là nếu bạn có một lớp có hàm tạo ít tham số và một hàm tạo với các đối số, thì ngoại lệ trong câu hỏi sẽ được ném ra.

Nếu bạn có hai hàm tạo với đối số, hành vi này là sử dụng hàm tạo phù hợp đầu tiên nơi các tham số được biết. Bạn có thể xem mã nguồn cho lớp ConstructorMatcher để biết chi tiết here.

0

ASP.NET Lõi trả lời

Tôi đã kết thúc với cách giải quyết sau cho đến khi họ sửa chữa/cải thiện điều này.

Đầu tiên, chỉ khai báo một bộ điều khiển trong bộ điều khiển (chỉ cần cài đặt cấu hình yêu cầu), xem xét các đối tượng cài đặt được truyền trong hàm khởi tạo có thể rỗng (.NET Core sẽ tự động chèn chúng nếu bạn định cấu hình chúng trong phương pháp khởi động)):

public class MyController : Controller 
{ 
    public IDependencyService Service { get; set; } 

    public MyController(IOptions<MySettings> settings) 
    { 
     if (settings!= null && settings.Value != null) 
     { 
      Service = new DependencyServiceImpl(settings.Value); 
     } 
    } 
} 

Sau đó, trong phương pháp kiểm tra, bạn có thể nhanh chóng điều khiển theo hai cách:

  1. Mocking phản đối các IOptions khi bạn xây dựng các đối tượng thử nghiệm
  2. Xây dựng thông qua null trong tất cả các tham số và sau đó Stub phụ thuộc mà bạn sẽ sử dụng trong các bài kiểm tra của bạn.Sau bạn có một ví dụ:
[TestClass] 
    public class MyControllerTests 
    { 
     Service.Controllers.MyController controller; 
     Mock<IDependencyService> _serviceStub; 

     [TestInitialize] 
     public void Initialize() 
     { 
      _serviceStub = new Mock<IDependencyService>(); 
      controller = new Service.Controllers.MyController(null); 
      controller.Service = _serviceStub.Object; 
     } 
    } 

Từ thời điểm này bạn có thể có thử nghiệm đầy đủ với dependency injection và chế giễu sẵn sàng trong NET Core.

Hy vọng điều này sẽ giúp

Các vấn đề liên quan