2012-12-21 26 views
8

Tôi đang bận phát triển mô-đun Orchard không ví dụ đầu tiên của mình. Nó là một số ít các bộ điều khiển và khung nhìn, với truy cập dữ liệu tùy chỉnh (EF), và phần lớn độc lập với các loại nội dung và các phần của Orchard. Thông thường tôi thiết lập ánh xạ trong một trình xử lý Application_Start, nhưng khi các hành động trong mô-đun MVC này sẽ được gọi trong ngữ cảnh của ứng dụng Orchard, tôi không còn có điểm vào đó nữa. Giải pháp rõ ràng nhất và ngay lập tức của tôi là di chuyển ánh xạ khởi tạo vào các hàm tạo tĩnh cho các mô hình chế độ xem được ánh xạ, ví dụ:Tôi có thể khởi tạo ánh xạ AutoMapper trong mô-đun Orchard ở đâu?

public class ApplicantPersonalDetailsModel : MappedViewModel<Applicant> 
{ 
    static ApplicantPersonalDetailsModel() 
    { 
     Mapper.CreateMap<Applicant, ApplicantPersonalDetailsModel>().Bidirectional(); 
    } 
    .... 
} 

Tôi có thể làm điều này bằng cách nào khác? là có một cách tốt hơn để làm điều này trong MVC3/4 nói chung, hoặc tốt hơn, một sự kiện hoặc móc tôi có thể lấy trong các ứng dụng Orchard cũng đạt được điều này trên khởi động applicaion?

Trả lời

3

Trình xử lý là nơi tốt nhất để khởi tạo biến của bạn, ngay cả khi bạn chưa xác định bất kỳ phần nào bên trong mô-đun, bạn có thể xác định một phần không có trình điều khiển nhưng với trình xử lý.

public class InitPartHandler : ContentHandler 
{ 
    public InitPartHandler(IRepository<InitPartRecord> repository) 
    { 
     OnInitializing<InitPart>((context, part) => 
       // do your initialization here 
      ); 
    } 
} 

EDIT

InitPart and InitPartRecord would be 

public class InitPart : ContentPart<InitPartRecord> 
{ 

} 

public class InitPartRecord : ContentPartRecord 
{ 

} 
+0

Có thể 'InitPartRecord' sau đó chỉ là giả, tức là rỗng, lớp học? Liệu Orchard có gọi Init trên tất cả các trình xử lý hay tôi phải đăng ký một phần ở đâu đó, ngay cả khi tôi không viết mã khác để xác định nó? – ProfK

+0

yes it can.InitPartHandler sẽ được đăng ký vào danh sách xử lý đơn giản bằng cách lái xe từ ContentHandler.and InitPart và InitPartRecord sẽ là một lớp giả như bạn đã đề cập.cehck chỉnh sửa của tôi. –

6

Con đường tôi đã thực hiện nó là bằng cách thực hiện IOrchardShellEvents

public class MenuOrchardShellEvents : IOrchardShellEvents 
    { 
     public void Activated() 
     { 
      Mapper.CreateMap<YSRB.Menu.Models.Records.Customer, YSRB.Menu.Models.ViewModels.CustomerViewModel>() 
       .ForMember(c => c.CustomerType, 
        m => m.MapFrom(
         x => (CustomerTypes)x.CustomerType 
        ) 
       ); 
      Mapper.CreateMap<YSRB.Menu.Models.ViewModels.CustomerViewModel, YSRB.Menu.Models.Records.Customer>() 
       .ForMember(c => c.CustomerType, 
        m => m.MapFrom(
         x => (int)x.CustomerType 
        ) 
       ); 
     } 

     public void Terminating() 
     { 
      //Do nothing 
     } 
    } 

Hope this helps.

+0

Tôi nên đặt cái này ở đâu? Trong một lớp học được đặt tên ngẫu nhiên bên trong mô-đun của tôi và Orchard kỳ diệu tìm thấy nó? – Highmastdon

+0

@Highmastdon yes. Tôi tin rằng Orchard sẽ tìm thấy tất cả các lớp học triển khai IOrchardShellEvents – ysrb

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