AutoMapper 9通用扩展静态类

时间:2019-09-12 02:26:56

标签: .net-core automapper

我想要一些帮助。

当我使AutoMappar 9停止工作时,我有一个使用Automapper 8 maas的通用类。 我正在寻找解决方案,但没有找到可以帮助我的人?​​

using System.Collections.Generic;

namespace Intranet.Services.Extensions {

    internal static class AutoMapperExtensions {

        public static T MapTo<T>(this object value)
        {
            return AutoMapper.Mapper.Map<T>(value);
        }

        public static IEnumerable<T> EnumerableTo<T>(this object value)
        {
            return AutoMapper.Mapper.Map<IEnumerable<T>>(value);
        }
    }
}
  

T AutoMapper.Mapper.Map(对象源)对象引用为   非静态字段,方法或属性所必需   'Mapper.Map(object)'(CS0120)

1 个答案:

答案 0 :(得分:0)

AutoMapper 9希望您使用依赖注入。这给我原来不想处理的遗留项目增加了一个整体的复杂性。

因此,我只是对其以前的工作进行了反向工程,并为其编写了一个包装器。

public static class MapperWrapper 
{
    private const string InvalidOperationMessage = "Mapper not initialized. Call Initialize with appropriate configuration. If you are trying to use mapper instances through a container or otherwise, make sure you do not have any calls to the static Mapper.Map methods, and if you're using ProjectTo or UseAsDataSource extension methods, make sure you pass in the appropriate IConfigurationProvider instance.";
    private const string AlreadyInitialized = "Mapper already initialized. You must call Initialize once per application domain/process.";

    private static IConfigurationProvider _configuration;
    private static IMapper _instance;

    private static IConfigurationProvider Configuration
    {
        get => _configuration ?? throw new InvalidOperationException(InvalidOperationMessage);
        set => _configuration = (_configuration == null) ? value : throw new InvalidOperationException(AlreadyInitialized);
    }

    public static IMapper Mapper
    {
        get => _instance ?? throw new InvalidOperationException(InvalidOperationMessage);
        private set => _instance = value;
    }

    public static void Initialize(Action<IMapperConfigurationExpression> config)
    {
        Initialize(new MapperConfiguration(config));
    }

    public static void Initialize(MapperConfiguration config)
    {
        Configuration = config;
        Mapper = Configuration.CreateMapper();
    }

    public static void AssertConfigurationIsValid() => Configuration.AssertConfigurationIsValid();
}

要使用它,只需在旧的Mapper调用之前添加MapperWrapper。

 MapperWrapper.Mapper.Map<Foo2>(Foo1);