Đây là giải pháp thay thế, vì chúng tôi không thể tìm thấy bất kỳ cách nào ngắn hơn để thực hiện ánh xạ đó.
Thứ nhất, bản đồ đến một lớp học thực hiện generic mở, như discussed elsewhere:
For(typeof(IRepository<>)).Use(typeof(ConcreteRepository<>));
Sau đó, đối với mỗi kho với hành vi tùy chỉnh, thêm các phương pháp mở rộng trên giao diện thích hợp. Ví dụ, giả sử bạn MailoutStatusRepository
có một phương pháp GetStatus()
, bạn có thể dịch là một phương pháp khuyến nông trên IRepository<MailoutStatusRepository>
:
public static Status GetStatus(this IRepository<MailoutStatusRepository> repo,
Mailout mail)
{
return mail.Status; // or whatever
}
Bây giờ bạn có hành vi kho tùy chỉnh mà không cần phải lo lắng về việc đúc ra StructureMap của một số lớp tùy chỉnh:
var repo = container.GetInstance<IRepository<MailoutStatusRepository>>();
var status = repo.GetStatus(mailout);
Một lợi ích khác của phương pháp này là hành vi lưu trữ tùy chỉnh của bạn hoạt động bất kể triển khai kho lưu trữ của bạn: trong thử nghiệm và trong mã sản xuất. Nhược điểm duy nhất (tôi nghĩ) là kho lưu trữ của bạn nhất thiết phải là không trạng thái, nhưng chúng tôi không thấy vấn đề này là vấn đề gì cả.
Câu hỏi liên quan - nếu tôi có một kho lưu trữ chung, có cách dễ dàng để ánh xạ (ví dụ: >(). Sử dụng >())? –
ssmith
Đối với câu hỏi liên quan, xem [Mở loại chung trong cấu trúc bản đồ] (http://codebetter.com/jeremymiller/2009/01/13/open-generic-types-in-structuremap/). – ladenedge