2009-07-13 29 views
7

Tôi đã tạo một giao diện ISearchable mà tôi đã đánh máy để tôi có thể lấy một IEnumerable của T cho kết quả.Unity Container - Chuyển tiếp T động đến phương thức Resolve

Tôi có một số dịch vụ mà thực hiện ISearchable cho các đối tượng miền khác nhau ...

Container.RegisterType<ISearchable<Animal>, AnimalService>(); 
Container.RegisterType<ISearchable<Fish>, FishService>(); 

tôi muốn giải quyết (thông qua Unity) một ISearchable dựa trên loại, nhưng đang gặp khó khăn để có được nó để làm việc ...

Sau đây không biên dịch nhưng hy vọng sẽ đưa ra ý tưởng về những gì tôi đang cố gắng đạt được.

Type t = typeof(Animal); 
var searchProvider = _container.Resolve<ISearchable<t>>(); 

Bất kỳ ai đã giúp nhận được sự biết ơn sâu sắc!

Cảm ơn,

Andy

Trả lời

12

Cuối cùng đã sắp xếp, hy vọng nó sẽ giúp ích cho người khác!

var type = filter.GetType(); 
var genericType = typeof(ISearchable<>).MakeGenericType(type); 
var searchProvider = _unityContainer.Resolve(genericType); 
0

Làm thế nào về ...

var sp = container.Resolve(
Type.GetType("ISearchable`1[" + yourGenericTypeHere + "]")); 
+0

Cảm ơn điều đó Dmitri, mặc dù tôi hy vọng có giải pháp mạnh mẽ - nếu có một giải pháp nào đó! :) –

2

Tại sao không đăng ký các loại của bạn bằng tên và giải quyết theo cách đó?

Container.RegisterType<ITelescopeView, TelescopeView>("type1"); 
Container.RegisterType<ITelescopeView, TelescopeView2>("type2"); 

Container.Resolve(ITelescopeView, "type1"); 

Nếu bạn muốn tên của bạn có thể chỉ đơn giản là tên đầy đủ của loại hoặc bạn có thể sử dụng tên khác. Cách tiếp cận của Dmitri cũng sẽ hoạt động. Nhưng điều này có thể dẫn đến mã rõ ràng hơn.

+0

Nhưng tôi vẫn cần phải T tự động vào phương thức giải quyết ... –

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