2011-06-30 25 views
5

Có cách nào trong StructureMap để thực hiện ánh xạ lặp đi lặp lại này với một dòng hoặc một quy ước không?Cách sử dụng quy ước cho IRepository <T> với ánh xạ StructureMap

For<IRepository<Mailout>>().Use<MailoutRepository>(); 
    For<IRepository<MailServer>>().Use<MailServerRepository>(); 
    For<IRepository<MailoutStatus>>().Use<MailoutStatusRepository>(); 
    For<IRepository<MailoutTemplate>>().Use<MailoutTemplateRepository>(); 
    For<IRepository<Publication>>().Use<PublicationRepository>(); 
    For<IRepository<Recipient>>().Use<RecipientRepository>(); 
+0

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

+0

Đố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

Trả lời

5

Để ánh xạ IRepository<Mailout>-MailoutRepository, sử dụng:

var c = new Container(x => 
{ 
    x.Scan(scan => 
    { 
     // there are other options to expand which assemblies to scan for types 
     scan.TheCallingAssembly(); 
     scan.ConnectImplementationsToTypesClosing(typeof (IRepository<>)); 
    }); 
}); 

Để ánh xạ IRepository<Mailout>-Repository<Mailout>, sử dụng:

var c = new Container(x => 
{ 
    x.For(typeof (IRepository<>)).Use(typeof (Repository<>)); 
}); 
0

Bạn có thể Greate cái gì đó như cơ sở Repository:

public class RepositoryBase<T> : IRepository<T> where T : Entity 

sau đó có một cái gì đó như thế này:

public class UserRepository : RepositoryBase<User>, IUserRepository 
public class OtherRepository : RepositoryBase<Other>, IOtherRepository 

nơi kho của bạn giao diện impelement giao diện kho lưu trữ chung như thế:

public interface IUserRepository : IRepository<User> 
public interface IOtherRepository : IRepository<Other> 

và sau đó bạn có thể đăng ký nó như thế:

For(typeof (IRepository<>)).Use(typeof (RepositoryBase<>)); 

Nó làm việc cho tôi.

+0

Tôi nghĩ rằng anh ấy đang tìm cách khởi tạo 'UserRepository', không phải' RepositoryBase ', đó là những gì có vẻ như mã của bạn không ..? – ladenedge

+0

Trong thực tế, bạn có thể giải quyết UserRepository mà không gặp bất kỳ vấn đề nào khi thực hiện điều đó: HomeController (IUserRepository userRepository) –

0

Đâ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ả.

0
Scan(x => 
{ 
    x.WithDefaultConventions(); 
    x.AssemblyContainingType(typeof(UserRepository)); 
    x.AddAllTypesOf(typeof(Repository<>)); 
    x.ConnectImplementationsToTypesClosing(typeof(IRepository<>)); 
}); 

WithDefaultConventions là một phần quan trọng của mã hiển thị, vì với điều này đặt bạn nói StructureMap để sử dụng quy ước mappping IUserRepository cho UserRepository. Vì vậy, StructureMap tiến hành từ giả định rằng lớp được đặt tên giống như tên của giao diện mà không có tiền tố I.

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