2012-12-21 39 views
8

我很忙於開發我的第一個非示例性果園模塊。它是少數控制器和視圖,具有自定義(EF)數據訪問權限,並且在很大程度上獨立於Orchard內容類型和部分。通常我在Application_Start處理程序中設置映射,但由於此MVC模塊中的操作將在Orchard應用程序的上下文中調用,因此我不再具有該入口點。我最明顯而直接的解決方案是將映射初始化移動到映射視圖模型的靜態構造函數中,例如我在哪裏可以初始化Orchard模塊中的AutoMapper映射?

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

我該怎麼辦?在MVC3/4中有沒有更好的方法來實現這一點,或者最好是我可以在Orchard應用程序中抓取的事件或鉤子,以便在應用程序啓動時實現此目的?

回答

3

處理程序是初始化變量的最佳位置,即使您尚未在模塊中定義任何部件,您可以定義沒有驅動程序但帶有處理程序的部件。

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

編輯

InitPart and InitPartRecord would be 

public class InitPart : ContentPart<InitPartRecord> 
{ 

} 

public class InitPartRecord : ContentPartRecord 
{ 

} 
+0

'InitPartRecord'然後可以是一個虛擬的,即空的類嗎? Orchard是否在所有處理程序上調用Init ,還是必須在某處註冊一個零件,即使我沒有編寫其他代碼來定義它? – ProfK

+0

是的,它可以.InitPartHandler將通過簡單地從ContentHandler驅動訂閱處理程序列表,並且InitPart和InitPartRecord將是您提到的虛擬類。請參閱我的編輯。 –

6

我已經做了它的方式是通過實施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 
     } 
    } 

希望這有助於。

+0

我應該把這個放在哪裏?在我的模塊內的一個隨機命名的類和果園神奇地發現它? – Highmastdon

+0

@Highmastdon是的。我相信Orchard會找到所有實現IOrchardShellEvents的類 – ysrb