Câu trả lời hay nhất của bạn là sử dụng vùng chứa.
Những gì bạn đang làm đang nói "khi tạo loại này, hãy sử dụng trường hợp cụ thể này của đối tượng". Điều này không tận dụng khả năng của container để xây dựng cá thể cho bạn. Thay vào đó, bạn nên đăng ký IService1 và IService2 trong vùng chứa. Sau đó, yêu cầu thùng chứa giải quyết những phụ thuộc đó cho bạn.
Nó trông giống như sau:
container.RegisterType<IService1, SomeService1>();
container.RegisterType<IService2, SomeService2>();
Điều này không là nói với container "bất cứ khi nào có một sự phụ thuộc của loại IService1, mới lên một đối tượng mới của loại SomeService1 và nhường lời rằng" và tương tự cho IService2 .
Vì vậy, tiếp theo, bạn cần phải thông báo cho bộ chứa những gì cần làm về ICustomerService. Trong hầu hết các tính tổng quát, bạn muốn làm điều này:
container.RegisterType<ICustomerService, CustomerService>(
// Note, don't need to explicitly say transient, that's the default
new InjectionConstructor(new ResolvedParameter<IService1>(),
new ResolvedParameter<IService2>()));
này cho container: khi giải quyết ICustomerService, mới lập một thể hiện của hậu mãi bằng cách sử dụng constructor mà mất IService1 và IService2. Để nhận các thông số đó, hãy gọi lại vào vùng chứa để giải quyết các loại đó.
Đây là chi tiết một chút và trường hợp thông thường, do đó, có một số phím tắt. Trước hết, bạn có thể vượt qua một đối tượng Loại thay vì làm ResolvedParameter mới, như vậy:
container.RegisterType<ICustomerService, CustomerService>(
new InjectionConstructor(typeof(IService1), typeof (IService2)));
Là viết tắt khác, nếu hậu mãi chỉ có một nhà xây dựng, hoặc nếu bạn muốn gọi là một trong đó mất lớn nhất danh sách tham số, bạn có thể rời khỏi tệp InjectionConstructor hoàn toàn, vì đó là hàm tạo mà vùng chứa sẽ chọn trong trường hợp không có cấu hình khác.
container.RegisterType<ICustomerService, CustomerService>();
Biểu mẫu bạn đang sử dụng thường được sử dụng khi bạn muốn một giá trị cụ thể được truyền cho tham số hàm tạo thay vì giải quyết dịch vụ qua vùng chứa.
Để trả lời câu hỏi ban đầu của bạn - tốt, bạn không thể làm chính xác những gì bạn đã nói. Tham số hàm tạo cần một giá trị của một số loại. Bạn có thể đặt bất cứ điều gì khác trong đó bạn muốn, mặc dù - null thường hoạt động.
Lưu ý bạn cũng có thể kết hợp hai biểu mẫu. Ví dụ, nếu bạn muốn giải quyết IService1 và vượt qua null cho tham số IService2, làm điều này:
container.RegisterType<ICustomerService, CustomerService>(
new InjectionConstructor(typeof(IService1), null));
* EDIT *
Dựa trên những nhận xét dưới đây, những gì bạn thực sự muốn là tính năng khác - tên đăng ký.
Về cơ bản, bạn có hai triển khai IService1 và một trong IService2. Vì vậy, những gì bạn có thể làm là đăng ký cả hai, và sau đó nói với các container mà một trong những sử dụng.
Trước hết, phải đăng ký thi thứ hai, bạn cần phải cung cấp một cái tên rõ ràng:
container.RegisterType<IService1, OtherService1Impl>("other");
Sau đó, bạn có thể nói với các container để giải quyết IService1 nhưng sử dụng tên. Đây là lý do chính mà loại ResolvedParameter tồn tại. Vì bạn chỉ muốn mặc định cho IService2, bạn có thể sử dụng typeof() làm viết tắt. Bạn vẫn cần phải xác định cả hai loại cho các tham số, nhưng bạn không cần một giá trị cụ thể. Nếu mà làm cho bất kỳ ý nghĩa.
container.RegisterType<ICustomerService, CustomerService>(
new InjectionConstructor(new ResolvedParameter<IService1>("other"), typeof(IService2));
Điều đó sẽ làm những gì bạn cần.
Hi and.maz, bạn đã nhận được bất kỳ giải pháp mà bạn không cần phải cung cấp các thông số khác gõ là tốt. một cái gì đó giống như giá trị quan trọng, nơi chúng tôi có thể chỉ định tên của nhà xây dựng và giá trị – rdhaundiyal