首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Automapper 2.2.1迁移到Automapper 4.2.1

从Automapper 2.2.1迁移到Automapper 4.2.1
EN

Stack Overflow用户
提问于 2016-04-18 06:36:19
回答 1查看 590关注 0票数 0

我有一个项目,我一直在使用Automapper2.2.1。我升级到4.2.1,完全崩溃了。我试图遵循,将对Mapper.CreateMap<Source, Target>()的所有引用都更改为Mapper.Initialize(cfg => { cfg.CreateMap<Source, Target>()})。我现在坏了,我似乎无法完成它,我得到的"System.Reflection.ReflectionTypeLoadException被用户代码异常处理,无法加载一个或多个所请求的类型。检索LoaderExceptions属性以获得更多信息“消息。我错过了什么。代码如下:

AutomapperTypeAdapterFactory

代码语言:javascript
复制
public class AutomapperTypeAdapterFactory : ITypeAdapterFactory
{
    public AutomapperTypeAdapterFactory()
    {
        //scan all assemblies finding Automapper Profile
        var profiles = AppDomain.CurrentDomain
                                .GetAssemblies()
                                .SelectMany(a => a.GetTypes())
                                .Where(t => t.BaseType == typeof(Profile));

        Mapper.Initialize(cfg =>
        {
            foreach (var item in profiles)
            {
                if (item.FullName != "AutoMapper.SelfProfiler`2")
                    cfg.AddProfile(Activator.CreateInstance(item) as Profile);
            }
        });
    }

    public ITypeAdapter Create() => new AutomapperTypeAdapter();
}

部门概况

代码语言:javascript
复制
public class DepartmentProfile : Profile
{
    protected override void Configure()
    {
        Mapper.Initialize(cfg =>
        {
            cfg.CreateMap<Department, DepartmentDto>();
        });
    }
}

UnityContainer

代码语言:javascript
复制
public static class Container
{
    static IUnityContainer _container = new UnityContainer();

    static Container()
    {
        var typeAdapterFactory = _container.Resolve<ITypeAdapterFactory>();
        TypeAdapterFactory.SetCurrent(typeAdapterFactory);
    }
    //other container resolutions....
}
EN

回答 1

Stack Overflow用户

发布于 2016-04-18 10:20:06

在脱离静态配置的项目中,我定义了几个映射配置文件(通常每个应用程序层都有一个概要文件):

代码语言:javascript
复制
public class MappingProfile : Profile
{
    protected override void Configure()
    {
        CreateMap<Source, Destination>();
    }
}

然后我配置我的IoC (在我的例子中是SimpleInjector),以查找所有的配置文件,并将它们添加到一个单一的统一配置中。然后,我在容器中注册MapperConfiguration,以及从该容器中创建的IMapper对象:

代码语言:javascript
复制
    public void ConfigureSimpleInjector(IAppBuilder app)
    {
        var container = new Container();
        container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();

        container.RegisterAutoMapper();

        container.RegisterMvcControllers(Assembly.GetExecutingAssembly());

        container.RegisterMvcIntegratedFilterProvider();

        container.Verify();

        DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
    }


public static Container RegisterAutoMapper(this Container container)
    {
        var profiles = typeof(AutoMapperRegistry).Assembly.GetTypes().Where(t => typeof(Profile).IsAssignableFrom(t)).Select(t => (Profile)Activator.CreateInstance(t));

        var config = new MapperConfiguration(cfg =>
        {
            foreach (var profile in profiles)
            {
                cfg.AddProfile(profile);
            }
        });

        container.Register<MapperConfiguration>(() => config);
        container.Register<IMapper>(() => container.GetInstance<MapperConfiguration>().CreateMapper());

        return container;
    }
}

然后,我可以将DI用于IMapper (或者您可以静态地存储它),以及用于LINQ投影的MapperConfiguration

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36686955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档