2012-12-21 7 views
8

Ich bin damit beschäftigt, mein erstes nicht-example Orchard-Modul zu entwickeln. Es ist eine Handvoll von Controllern und Ansichten, mit benutzerdefinierten (EF) Datenzugriff und ist weitgehend unabhängig von Orchard Content-Typen und Teilen. Normalerweise richte ich Mappings in einem Application_Start-Handler ein, aber da die Aktionen in diesem MVC-Modul im Kontext der Orchard-Anwendung aufgerufen werden, habe ich diesen Einstiegspunkt nicht mehr. Meine offensichtlichste und unmittelbarste Lösung besteht darin, die Mapping-Initialisierung in statische Konstruktoren für gemappte Ansichtsmodelle, z.Wo kann ich AutoMapper-Zuordnungen in einem Orchard-Modul initialisieren?

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

Wie sonst kann ich das tun? Gibt es einen besseren Weg, dies in MVC3/4 im Allgemeinen zu tun, oder vorzugsweise, ein Ereignis oder einen Haken, den ich in der Orchard-Anwendung greifen kann, um dies auch beim Anwendungsstart zu erreichen?

Antwort

3

Der Handler ist der beste Ort für die Initialisierung Ihrer Variablen, auch wenn Sie keinen Teil in Ihrem Modul definiert haben, können Sie einen ohne Treiber mit Handler definieren.

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

Kann 'InitPartRecord' dann nur ein Dummy sein, d. H. Leer, Klasse? Ruft Orchard nur Init auf allen Handlern an, oder muss ich irgendwo ein Teil registrieren, auch wenn ich keinen anderen Code schreibe, um es zu definieren? – ProfK

+0

Ja, es kann.InitPartHandler wird Handler-Liste abonniert werden, indem Sie einfach von ContentHandler.and und die InitPart und InitPartRecord wäre eine Dummy-Klasse wie Sie erwähnt.cehck meine Bearbeitung. –

6

So wie ich es getan habe, ist von 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 
     } 
    } 

hoffe, das hilft zu implementieren.

+0

Wo soll ich das hinstellen? In einer zufälligen benannten Klasse in meinem Modul und Orchard findet es magisch? – Highmastdon

+0

@Highmastdon ja. Ich glaube, Orchard wird alle Klassen finden, die IOrchardShellEvents implementieren – ysrb

Verwandte Themen