2013-03-16 147 views
10

Giả sử tôi có giao diện chung và triển khai chung. Làm cách nào để đăng ký tất cả các tập quán?Cách đăng ký giao diện chung bằng TinyIOC

Cụ thể, tôi có như sau (giảm vì đơn giản):

public interface IRepository<T> where T : TableEntity 
{ 
    T GetById(string partitionKey, string rowKey); 
    void Insert(T entity); 
    void Update(T entity); 
    void Update(string partitionKey, string rowKey, Action<T> updateAction); 
    void Delete(T entity); 
    IQueryable<T> Table { get; } 
} 


public class AzureRepository<T> : IRepository<T> where T : TableEntity 
{ 
    ... 
} 

Tôi có cần phải đăng ký tất cả triển khai từng người một, như vậy:

container.Register<IRepository<Entity1>, AzureRepository<Entity1>>(); 
container.Register<IRepository<Entity2>, AzureRepository<Entity2>>(); 
container.Register<IRepository<Entity3>, AzureRepository<Entity3>>(); 
... 

Hoặc là có một cách ngắn ?

+1

Đây có phải là những gì bạn đang tìm kiếm không? https://github.com/grumpydev/TinyIoC/issues/8 –

+0

Không - Trong ví dụ này, nó đăng ký tất cả các phụ thuộc IRepository (IR , IR , vv ..) dưới dạng AzureRepository . – seldary

+0

Tôi có thể xác nhận hành vi này (trong v1.2) - nhưng rõ ràng là một lỗi. – TeaDrivenDev

Trả lời

10

Như đã đề cập trong bình luận của tôi, TinyIoC có lỗi ở độ phân giải của Open Generics - nó không giữ các trường hợp đã giải quyết với các tham số kiểu khác nhau. ví dụ đầu tiên của loại chung được giải quyết cho tất cả các yêu cầu giải quyết tiếp theo.

Do đó, sau đây không làm việc:

container.Register(typeof(IRepository<>), typeof(AzureRepository<>)); 

Có một workaround, tuy nhiên - làm cho thoáng đăng ký:

container.Register(typeof(IRepository<>), typeof(AzureRepository<>)).AsMultiInstance(); 

này sẽ tạo một đối tượng mới cho mỗi độ phân giải yêu cầu và tôn trọng đúng thông số loại. Nhược điểm của việc này là bạn cũng nhận được một cá thể mới mỗi khi bạn yêu cầu giao diện với một tham số kiểu đã được giải quyết trước đó.

Sửa

Xác nhận. Mở độ phân giải Generics không sử dụng SingletonFactory rằng một khi nó đã tạo ra một thể hiện sẽ luôn luôn trả về cho các nghị quyết tiếp theo. Nó không biết hoặc quan tâm đến Generics. Để điều này hoạt động đúng, yêu cầu GenericSingletonFactory không chỉ giữ một trường hợp duy nhất mà một từ điển được khóa bằng loại bê tông cần giải quyết.

Được rồi, điều đó thậm chí không khó khắc phục. Tôi chỉ không hiểu đủ về nó để chắc chắn rằng nó thực sự là chính xác.

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