首页 > 解决方案 > 如何在解决方案中查找所有 AutoMap 配置文件并注册它们

问题描述

我正在使用 net core 3.1 和 AutoMapper 10.1.1。

我在 auto-mapera 的解决方案分散配置文件中有不同的项目。

如何获取解决方案中所有配置文件的列表并注册它们而不是引用每个项目?

namespace Boilerplate.WepApp.Automap
{
    public class WebAppAutoMap : Profile
    {
    }
}
namespace Boilerplate.Blogs.Automap
{
    public class BlogsAutoMap : Profile
    {
    }
}

并且有一个自动映射器配置代码

namespace Boilerplate.WepApp.Automap
{
    public static class AutoMapperExtensions
    {
        public static void AddAutoMapper(this IServiceCollection services)
        {
            var mapper = new MapperConfiguration(mc =>
            {
                mc.AddProfile(new WebAppAutoMap());
                mc.AddProfile(new BlogsAutoMap());
            }).CreateMapper();

            services.AddSingleton(mapper);
        }
    }
}

如何获取解决方案中所有配置文件的列表并注册它们?

为了不违反整个项目的架构,这是必要的。

标签: c#asp.net-mvcasp.net-coreautomapper

解决方案


AutoMapper 有一些扩展来扫描 AutoMapper 类并使用服务集合注册配置、映射和扩展。

您只需要在其中一个扩展上交付您的图层程序集:

public static class ServiceCollectionExtensions
{
    public static IServiceCollection AddAutoMapper(this IServiceCollection services, Action<IMapperConfigurationExpression> configAction)
        => AddAutoMapperClasses(services, (sp, cfg) => configAction?.Invoke(cfg), null);

    public static IServiceCollection AddAutoMapper(this IServiceCollection services, params Assembly[] assemblies)
        => AddAutoMapperClasses(services, null, assemblies);

    public static IServiceCollection AddAutoMapper(this IServiceCollection services, Action<IMapperConfigurationExpression> configAction, params Assembly[] assemblies)
        => AddAutoMapperClasses(services, (sp, cfg) => configAction?.Invoke(cfg), assemblies);

    ...

}

然后,AutoMapper 将解决这个问题:

private static IServiceCollection AddAutoMapperClasses(IServiceCollection services, Action<IServiceProvider, IMapperConfigurationExpression> configAction,
    IEnumerable<Assembly> assembliesToScan, ServiceLifetime serviceLifetime = ServiceLifetime.Transient)
{
   ...

    var assembliesToScanArray = assembliesToScan as Assembly[] ?? assembliesToScan?.ToArray();

   ...
}

DI的扩展方法示例

public static class ConfigureServices
{
    public static IServiceCollection AddAutoMapper(this IServiceCollection services)
        => services.AddAutoMapper(
            AppDomain.CurrentDomain.GetAssemblies()
                .Where(x => x.FullName?
                    .Contains("Boilerplate") ?? false));
}

或者更动态

public static class ConfigureServices
{
    public static IServiceCollection AddAutoMapper(this IServiceCollection services)
        => services.AddAutoMapper(
            AppDomain.CurrentDomain.GetAssemblies()
                .Where(x => x.FullName?
                    .Contains(GetAssemblySuffix()) ?? false));

    private static string GetAssemblySuffix()
        => Assembly.GetEntryAssembly()?.FullName?.Substring(0, 11);
}

在启动时使用

public void ConfigureServices(IServiceCollection services)
{
    ...

    services.AddAutoMapper();

    ...
}

推荐阅读