【问题标题】:Using AutoMapper inside a static class in .NET Core 3 with C#使用 C# 在 .NET Core 3 的静态类中使用 AutoMapper
【发布时间】:2021-06-25 12:40:21
【问题描述】:

我正在从扩展方法类中的某个层转移一些逻辑。问题是我想在具有扩展方法的静态类中使用自动映射器。该项目在.NET Core上运行,我无法在静态类中访问AutoMapper,就像在控制器类中通常我们使用构造函数注入AutoMapper一样,但静态类没有构造函数。

有什么方法可以调用已经在Startup.cs中配置的AutoMapper服务,以任何方式在一个静态类中?

【问题讨论】:

  • 静态类确实有构造函数——static。但是,不建议将它们用于任何可能失败的重要事项,因为几乎不可能自信地预测静态构造函数何时运行,因此错误处理变得非常痛苦。如果你的类依赖于 Automapper,你应该明确说明——公开一个方法来初始化 Startup.cs 在扩展方法可以使用之前应该调用的东西。如果您真的很友善,请让方法检测到何时未执行此操作以给出合理的错误。
  • 您可以考虑使用单例服务而不是静态类,然后您可以在该服务上注入 IMapper 实例。
  • @JeroenMostert 感谢您的洞察力和宝贵意见。

标签: c# .net .net-core automapper


【解决方案1】:

当您需要在静态方法中使用 AutoMapper 时,您只有两种可能:

  1. 将 AutoMapper 作为附加参数添加到您的静态方法中。
  2. 为所需的配置文件即时创建映射器。

虽然第一个是不言自明的,但第二个需要一个额外的辅助方法,这样更容易使用:

using System;

namespace AutoMapper
{
    public static class WithProfile<TProfile> where TProfile : Profile, new()
    {
        private static readonly Lazy<IMapper> MapperFactory = new Lazy<IMapper>(() =>
        {
            var mapperConfig = new MapperConfiguration(config => config.AddProfile<TProfile>());
            return new Mapper(mapperConfig, ServiceCtor ?? mapperConfig.ServiceCtor);
        });

        public static IMapper Mapper => MapperFactory.Value;

        public static Func<Type, object> ServiceCtor { get; set; }

        public static TDestination Map<TDestination>(object source)
        {
            return Mapper.Map<TDestination>(source);
        }
    }
}

有了这个,你就有了一个静态方法,可以按如下方式使用:

var dest = WithProfile<MyProfile>.Map<Destination>(source);

但请注意,第二种方法相当繁重,根据调用该方法的时间长短,您最好使用第一种方法。

【讨论】:

  • Good Day Oliver,我选择了第一种方法,因为我想避免动态创建配置文件并依赖于我想跟踪实现 API 本身。不过,您的第二个选项非常有趣,我将尝试围绕您的第二个实现运行一些单元测试用例。非常感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-10
  • 1970-01-01
  • 2020-03-20
  • 2022-01-23
  • 2019-05-13
相关资源
最近更新 更多