2012-12-21 1 views
8

私は最初の例ではないオーチャード・モジュールを開発しています。これは、カスタム(EF)データアクセスを備えたコントローラとビューの数少ないもので、オーチャードのコンテンツタイプやパーツにはほとんど依存しません。通常、私はApplication_Startハンドラでマッピングを設定しますが、このMVCモジュールのアクションはOrchardアプリケーションのコンテキストで呼び出されるため、そのエントリポイントはありません。私の最も明白で直接的な解決策は、マッピング初期化をマップされたビューモデルのための静的コンストラクタに移動することです。OrchardモジュールのAutoMapperマッピングはどこで初期化できますか?

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

どうすればいいですか?一般的にMVC3/4でこれを行うより良い方法がありますか、またはイベントやフックを使ってOrchardアプリケーションを起動して、アプリケーション起動時にこれを達成することができますか?

答えて

3

モジュール内に部品を定義していなくても、ドライバなしでハンドラを定義することができますが、ハンドラは変数を初期化するのに最適な場所です。私はそれを行っている方法は、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 
     } 
    } 

を実装することである

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

'InitPartRecord'はダミーのクラス、つまり空のクラスですか? OrchardはすべてのハンドラでInit を呼び出すだけですか?それを定義するための他のコードを記述していない場合でも、どこかでパートを登録する必要はありますか? – ProfK

+0

はい、可能です.InitPartHandlerはContentHandlerから単純にドライブすることでハンドラリストに登録されます。InitPartとInitPartRecordはあなたが言及したようにダミークラスになります。 –

6

は、この情報がお役に立てば幸いです。

+0

どこに置いたらいいですか?私のモジュールの中のランダムな名前のクラスで、オーチャードはそれを魔法のように見つけますか? – Highmastdon

+0

@Highmastdonはい。私はオーチャードがIOrchardShellEventsを実装するすべてのクラスを見つけると信じています – ysrb

関連する問題