Tôi đang sử dụng vùng chứa Unity IoC để giải quyết các đối tượng của mình. Tuy nhiên, tôi đã gặp phải vấn đề. Khi tôi có nhiều hơn một nhà xây dựng - Unity biết cái nào để sử dụng? Nó dường như sử dụng một với các tham số khi tôi có một với một và không có. Tôi có thể nói một cách rõ ràng nó để sử dụng constructor nào không?Chỉ định hàm tạo cho vùng chứa Unity IoC để sử dụng
Cụ thể, tôi đã có một trường hợp tương tự như lớp Person sau đây với hai hàm tạo. Trong trường hợp này, tôi muốn container IoC sử dụng hàm tạo mặc định - không có tham số - nhưng nó chọn một tham số có tham số.
public class SomeValueObject
{
public SomeValueObject(string name)
{
Name = name;
}
public string Name { get; set; }
}
public class Person
{
private string _name;
public Person()
{
_name = string.Empty;
}
public Person(SomeValueObject obj)
{
_name = obj.Name;
}
}
Điều này rõ ràng là không thành công vì không thể tạo SomeValueObject - không biết phải đưa vào thông số chuỗi của nó. Lỗi mà nó đưa ra là:
Độ phân giải của phụ thuộc không thành công, type = "MyApp.Person", name = "". Thông báo ngoại lệ là: Hoạt động xây dựng hiện tại (khoá xây dựng Khóa [MyApp.Person, null]) không thành công: Tham số obj không thể được giải quyết khi cố gắng gọi hàm tạo MyApp.Person (MyApp.SomeValueObject obj). (Chiến lược loại BuildPlanStrategy, chỉ số 3)
Việc đăng ký container:
Container.RegisterType<Person, Person>(new Microsoft.Practices.Unity.ContainerControlledLifetimeManager());
Và giải quyết:
var person = Container.Resolve<Person>();
Không phải là điểm của IoC để sử dụng giao diện ??? – Martin
Chắc chắn, và tôi làm điều đó chủ yếu. Nhưng điều này không tạo ra sự khác biệt cho câu hỏi. – stiank81
@Martin Nhiều lập trình viên sử dụng các lớp và tránh tính tổng quát giả tạo ra một giao diện và sau đó chỉ thực hiện một giao diện của nó. Nó cũng tránh được khối lượng dây IoC có mùi mà bạn thấy trong hầu hết các ứng dụng doanh nghiệp, nhưng vẫn cho phép bạn chuyển đổi một số triển khai khi cần. http://programmers.stackexchange.com/questions/133471/writing-testable-code-vs-avoiding-speculative-generality –