通用映射器,而不是有许多单独的映射器

Bre*_*ogt 2 c# asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-2

我使用ASP.NET MVC 3RazorAutofac依赖注入.

我正在考虑创建一个通用映射器.目前我AutoMapper用于我的域和视图模型之间的映射.它可以是任何映射框架,但我使用的是AutoMapper.

这是我的IMapper界面:

public interface IMapper
{
     object Map(object source, Type sourceType, Type destinationType);
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个实现这个IMapper接口的IBankMapper接口.我这样做的原因是因为我可以有很多不同的映射器.使用依赖注入我可以知道我可以注入什么实例.所以对于IBankMapper我会注入BankMapper,ICategoryMapper我会注入CategoryMapper.

IBankMapper 接口:

public interface IBankMapper : IMapper
{
}
Run Code Online (Sandbox Code Playgroud)

BankMapper 类:

public class BankMapper : IBankMapper
{
     static BankMapper()
     {
          Mapper.CreateMap<Bank, EditBankViewModel>();
          Mapper.CreateMap<EditBankViewModel, Bank>();
     }

     public object Map(object source, Type sourceType, Type destinationType)
     {
          return Mapper.Map(source, sourceType, destinationType);
     }
}
Run Code Online (Sandbox Code Playgroud)

随着程序的增长,映射器类也将如此.有没有办法可以创建一个通用映射器,可以在整个应用程序中使用?这可能吗?

Jus*_*ner 5

完全没有必要创建任何映射器类.

您需要做的就是确保Mapper.CreateMap在申请开始时致电.然后,您可以使用Mapper.Map您的映射.

通常,我使用单个方法创建一个静态类来处理我的地图的创建.它看起来像:

public static class Transformers
{
    public static void Register()
    {
        Mapper.CreateMap<Bank, EditBankViewModel>();
        Mapper.CreateMap<EditBankViewModel, Bank>();

        Mapper.CreateMap<Account, EditAccountViewModel>();
        Mapper.CreateMap<EditAccountViewModel, Account>();

        // And so on. You can break them up into private methods
        // if you have too many.
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我在Global.asax中调用该方法确保它在必要时运行.在我的应用程序中的任何其他位置,我可以随意调用Mapper.Map任何已配置的映射:

protected void Application_Start()
{
    Transformers.Register();
}
Run Code Online (Sandbox Code Playgroud)