Tôi có giao diện (IRepository<T>
) hiện đang được mở rộng cho từng kho lưu trữ cụ thể, ví dụ: IUserRepository : IRepository<User>
.Tự động giải quyết giao diện <T> để triển khai <T> trong StructureMap (chỉ khác với kiểu chung T)
Mỗi giao diện này có các lớp bê tông tương ứng, ví dụ: UserRepository : Repository<User>, IUserRepository
.
Các kho lưu trữ riêng lẻ này không thêm bất kỳ chức năng bổ sung nào, chúng là tất cả các giao diện/lớp trống được sử dụng đơn giản để truyền các generics xung quanh.
Tôi sử dụng StructureMap để giải quyết IUserRepository
thành UserRepository
bằng cách sử dụng Cơ quan đăng ký có máy quét lắp ráp và một số quy ước đặt tên.
Tôi muốn này để di chuyển đến một cách tình trạng tối ưu hóa hơn, nơi thay vì đi qua xung quanh trường hợp của IUserRepository
và nhận được nó quyết tâm UserRepository
, tôi có thể vượt qua xung quanh IRepository<User>
và có nó quyết tâm Repository<User>
.
Điều này sẽ loại bỏ sự cần thiết phải tạo thêm các giao diện và lớp trống này.
Tôi không thể tìm cách sử dụng cấu hình StructureMap để thiết lập ánh xạ chung này. Một cái gì đó như thế này:
For(typeof(IRepository<>).Use(typeof(Repository<>)).WithTheGenericTypeFromTheInterfaceSuppliedAsATypeParameter();
Sửa
Sau khi nhận được các cặp vợ chồng đầu tiên của câu trả lời, tôi muốn làm rõ điều này hơn một chút.
Tôi không muốn tạo các lớp riêng lẻ cho bit For
của cấu hình. Tôi muốn có các lớp/giao diện sau trong mã của tôi:
IRepository<T> where T : Entity
Repository<T> : IRepository<T> where T : Entity
Person : Entity
Product : Entity
Order : Entity
Whatever : Entity
Và đã ánh xạ sau đạt được với ước:
IRepository<Person> => Repository<Person>
IRepository<Product> => Repository<Product>
IRepository<Order> => Repository<Order>
IRepository<Whatever> => Repository<Whatever>
Nhưng tôi không muốn có để tạo ra một bản đồ cho mỗi người, ala:
For<IRepository<Person>>().Use<Repository<Person>>();
For<IRepository<Product>>().Use<Repository<Product>>();
For<IRepository<Order>>().Use<Repository<Order>>();
For<IRepository<Whatever>>().Use<Repository<Whatever>>();
tôi muốn có một bản đồ duy nhất mà sẽ làm việc cho bất kỳ IRepository:
For<IRepository<>>().Use<Repository<>>().WithTheSameGenericType();
sau đó tôi sẽ sử dụng để bơm các kho vào các dịch vụ:
public MyService(IRepository<User> userRepository)
Và hy vọng điều đó sẽ được giải quyết thành Repository<User>
khi chạy.
cấu hình mong muốn của bạn là đã thực (không cần WithTheGenericTypeFromTheInterfaceSuppliedAsATypeParameter). Bạn đã thử nó và nó không hoạt động? –
Tôi phải đã làm sai - nó sẽ không biên dịch lúc đầu, vì vậy tôi nghĩ rằng tôi sử dụng phiên bản chung của phương pháp (mặc dù khi tôi viết câu hỏi tôi đã sử dụng không chung chung). Một trong những buổi sáng đó. –