【问题标题】:Where can I initialize AutoMapper mappings in an Orchard module?我在哪里可以在 Orchard 模块中初始化 AutoMapper 映射?
【发布时间】:2012-12-21 06:24:28
【问题描述】:

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

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

我还能怎么做?一般来说,在 MVC3/4 中是否有更好的方法来执行此操作,或者最好是我可以在 Orchard 应用程序中抓取的事件或挂钩,以便在应用程序启动时也实现此目的?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 automapper orchardcms


    【解决方案1】:

    我的做法是实现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
            }
        }
    

    希望这会有所帮助。

    【讨论】:

    • 我应该把这个放在哪里?在我的模块内的一个随机命名的类中,Orchard 神奇地找到了它?
    • @Highmastdon 是的。我相信 Orchard 会找到所有实现 IOrchardShellEvents 的类
    【解决方案2】:

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

    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
    {
    
    }
    

    【讨论】:

    • InitPartRecord 可以只是一个假人,即空的,类吗? Orchard 是否只是在所有处理程序上调用 Init,还是我必须在某处注册一个部件,即使我没有编写其他代码来定义它?
    • 是的,它可以。InitPartHandler 将通过简单地从 ContentHandler 驱动来订阅处理程序列表。正如你提到的,InitPart 和 InitPartRecord 将是一个虚拟类。请检查我的编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 2015-09-23
    相关资源
    最近更新 更多