我在哪里可以初始化Orchard模块中的AutoMapper映射?

Pro*_*ofK 8 asp.net-mvc automapper orchardcms asp.net-mvc-4

我正忙着开发我的第一个非示例Orchard模块.它是一些控制器和视图,具有自定义(EF)数据访问,并且在很大程度上独立于Orchard内容类型和部件.通常我在Application_Start处理程序中设置映射,但由于此MVC模块中的操作将在Orchard应用程序的上下文中调用,因此我不再具有该入口点.我最明显和最直接的解决方案是将映射初始化移动到映射视图模型的静态构造函数中,例如

public class ApplicantPersonalDetailsModel : MappedViewModel<Applicant>
{
    static ApplicantPersonalDetailsModel()
    {
        Mapper.CreateMap<Applicant, ApplicantPersonalDetailsModel>().Bidirectional();
    }
    ....
}
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做?有没有更好的方法在MVC3/4中执行此操作,或者最好是我可以在Orchard应用程序中获取的事件或挂钩,以便在应用程序启动时实现此目的?

ysr*_*srb 7

我这样做是通过实施 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
        }
    }
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.


Beh*_*ili 3

处理程序是初始化变量的最佳位置,即使您没有在模块内定义任何部分,您也可以定义一个不带驱动程序但带有处理程序的部分。

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

编辑

InitPart and InitPartRecord would be  

public class InitPart : ContentPart<InitPartRecord>
{

}

public class InitPartRecord : ContentPartRecord
{

}
Run Code Online (Sandbox Code Playgroud)