7

Hãy tưởng tượng tôi có dưới đây:Đăng ký một singleton qua SimpleInjector và trở về cùng một ví dụ, đối với các giao diện khác nhau nó thực hiện

public interface IocInterface1 { } 

public interface IocInterface2 { } 

public class IocImpl : IocInterface1, IocInterface2 { } 

Tôi muốn rằng nếu tôi cố gắng để có được bất kỳ trường hợp của các lớp trên/interfaces qua IoC, tôi nhận được cùng một ví dụ, không phải một singleton cho mỗi loại. Ví dụ, b1b2 dưới đây sẽ là sự thật:

_container.RegisterSingle<IocInterface1, IocImpl>(); 
_container.RegisterSingle<IocInterface2, IocImpl>(); 
_container.RegisterSingle<IocImpl, IocImpl>(); 

var test1 = _container.GetInstance<IocInterface1>(); 
var test2 = _container.GetInstance<IocInterface2>(); 
var test3 = _container.GetInstance<IocImpl>(); 

bool b1 = test1 == test2; 
bool b2 = test2 == test3; 

Đây có phải là có thể?

Trả lời

10

Nếu bạn muốn đăng ký nhiều loại với cùng một đăng ký thì bạn sẽ cần một đối tượng đăng ký đơn cho loại triển khai của bạn IocImpl.

Sau đó, bạn cần phải sử dụng AddRegistration để thêm đăng ký này cho các dịch vụ khác nhau: IocInterface1, IocInterface2 v.v .:

var _container = new Container(); 
var registration = 
    Lifestyle.Singleton.CreateRegistration<IocImpl, IocImpl>(_container); 

_container.AddRegistration(typeof(IocImpl), registration); 
_container.AddRegistration(typeof(IocInterface1), registration); 
_container.AddRegistration(typeof(IocInterface2), registration); 

như mô tả trong documenation: Register multiple interfaces with the same implementation

Ngoài ra, bạn cũng có thể làm cho một ánh xạ sử dụng các đại biểu:

_container.RegisterSingle<IocImpl>(); 
_container.RegisterSingle<IocInterface1>(() => container.GetInstance<IocImpl>()); 
_container.RegisterSingle<IocInterface2>(() => container.GetInstance<IocImpl>()); 

Trong hầu hết các trường hợp, cả hai bài kiểm tra ples là chức năng tương đương, nhưng trước đây được ưa thích.

+0

Điều này có vẻ tốt cho những gì tôi cần - Tuy nhiên, nó có phục vụ cho 'container.RegisterSingleOpenGeneric()' không? Lý do là tôi có một máy quét lắp ráp quét tất cả các loại mà tôi trang trí với một thuộc tính tùy chỉnh mà tôi đã tạo ra '[IocComponent]', và điều này cũng phục vụ cho các thế hệ mở. –

+0

'RegisterSingleOpenGeneric' hoạt động hơi khác một chút vì nó đang tạo đăng ký trên bay trong sự kiện' ResolveUnregisteredType' ... Tôi phải suy nghĩ về cách nó có thể được thực hiện mà không thay thế logic của phương thức 'RegisterSingleOpenGeneric'. Nhưng tôi nghĩ bạn nên hỏi đây là một câu hỏi tiếp theo, nơi bạn chỉ định chi tiết về cách quét hoạt động và cách nó cố gắng đăng ký các loại chung. – nemesv

+0

Tôi đồng ý với @nemesv: vui lòng đặt câu hỏi mới với các chi tiết này. Câu trả lời này là chính xác. 1 cho điều đó. – Steven