2009-05-16 31 views
6

Tôi đã điều sau đây:Lâu đài Windsor Giải quyết và Generics

public interface ISubject { ... } 

public class Subject<T> : ISubject { ... } 

public class MyCode<T> { 
    ... 
    pulic void MyMethod() 
    { 
     var item = container.Resolve<ISubject>(); //????? how do I pass in T 
    } 
    ... 
} 

Trong trường hợp này làm thế nào để thực hiện quyết tâm.

Cheers Anthony

Trả lời

12

vdhant - Đó không phải là cách container có nghĩa là để được sử dụng.

Bạn muốn sử dụng ISubject, phải không ?. Sau đó, nếu bạn vượt qua T, bạn sẽ phá vỡ sự trừu tượng của mình, bởi vì người gọi của bạn phải biết rằng ISubject, thực sự là Chủ đề và hơn thế nữa, nó là Subject<T> và nó yêu cầu một hình ảnh cụ thể T.

Không có vùng chứa nào cho phép , nhưng đó là một vấn đề thiết kế, không phải vấn đề về công cụ.

Một điều cần sửa chữa thiết kế của bạn, sẽ là để làm cho nó rõ ràng - thay đổi ISubject-ISubject<T>

Sau đó, bạn có thể đăng ký mở generic loại ISubject<> và ràng buộc nó để mở generic loại Subject<>.

container.Register(Component.For(typeof(ISubject<>)) 
          .ImplementedBy(typeof(Subject<>))); 

Sau đó, bạn sẽ có thể làm

var fooSubject = container.Resolve<ISubject<Foo>>(); 

Bạn đã không cung cấp bất kỳ bối cảnh như vậy tôi có thể tắt theo dõi với câu trả lời, nhưng có một điều chắc chắn là - bạn có một vấn đề thiết kế.

+0

Thật tuyệt vì vậy ý ​​tôi là tôi cần cung cấp một phiên bản chung của giao diện và sau đó tôi có thể làm những gì tôi muốn làm ... âm thanh tốt với tôi. Chúc mừng – vdhant

+0

cảm ơn đã cứu tôi .. –

+0

Chúc mừng bạn đã giúp @EhsanSajjad –

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