c# - 如何在解决方案中查找所有 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);
}
}
}
如何获取解决方案中所有配置文件的列表并注册它们?
为了不违反整个项目的架构,这是必要的。
解决方案
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();
...
}
推荐阅读
- javascript - 'Firebase 未定义' Firebase 版本 9 的答案
- docker - docker-compose.yml 容器定义中的目标端口和已发布端口之间有什么区别?
- laravel - Laravel/Scout - 如何获取文档总数?
- python - 通过 Python 将 PDF 拆分为不相等的段
- reactjs - I got undefined data while getting it from useSelector in react
- c++ - (为什么不)在定义时初始化 struct val
- c++ - 为什么没有声明从基模板类继承的成员函数?
- python - 拆分数据集后如何绘制带有色调的pairplot
- python - 当我在 DataFrame 中使用双括号时会发生什么?
- python - 使用 youtube.search().list 时获取相同的 youtube 频道 ID