Asp.net core 如何在AutoMapper配置文件类中注入服务
我需要在Asp.net core 如何在AutoMapper配置文件类中注入服务,asp.net-core,automapper,Asp.net Core,Automapper,我需要在ASP.NET Core中的AutoMapperprofile类中使用服务层,但是当我在构造函数中注入服务时,它不起作用。例如: public class UserProfile : Profile { private readonly IUserManager _userManager; public UserProfile(IUserManager userManager) { _userManager = userManager;
ASP.NET Core
中的AutoMapper
profile类中使用服务层,但是当我在构造函数中注入服务时,它不起作用。例如:
public class UserProfile : Profile
{
private readonly IUserManager _userManager;
public UserProfile(IUserManager userManager)
{
_userManager = userManager;
CreateMap<User, UserViewModel>()
.ForMember(dest => dest.FullName, opt => opt.MapFrom(src => $"{src.FirstName} {src.LastName}"));
}
}
如何做?要解决您的问题,您只需在DI中连接
IUserManager
,并确保UserProfile
依赖关系已解决
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddSingleton<IUserManager, UserManager>();
services.AddSingleton(provider => new MapperConfiguration(cfg =>
{
cfg.AddProfile(new UserProfile(provider.GetService<IUserManager>()));
}).CreateMapper());
}
public void配置服务(IServiceCollection服务)
{
// ...
services.AddSingleton();
services.AddSingleton(provider=>newMapPerConfiguration(cfg=>
{
AddProfile(新的UserProfile(provider.GetService());
}).CreateMapper());
}
话虽如此,我可能会尝试保持每个类的单一责任,而不会将任何服务注入映射配置文件中。您可以在映射之前填充对象。这样,单元测试也可能更容易。出于此目的,最好使用自定义IValueResolver,因为它完全支持IServiceCollection集成(使用) 您可能需要实现自定义值解析程序:
public class UserViewModelValueResolver: IValueResolver<...>
{
public readonly IUserManager userManager;
public UserViewModelValueResolver(IUserManager userManager)
{
this.userManager = userManager;
}
...
}
公共类UserViewModelValueResolver:IValueResolver
{
公共只读IUserManager用户管理器;
公共用户视图模型值解析程序(IUserManager用户管理器)
{
this.userManager=userManager;
}
...
}
在服务业的注册可减少至:
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddSingleton<IUserManager, UserManager>();
}
public void配置服务(IServiceCollection服务)
{
// ...
services.AddSingleton();
}
然后,通过构造函数注入IMapper
,可以在控制器内获得映射器实例
基于:我知道这个问题不是最近才提出的,但是有一个nuget包可以解决这个问题: 您可以通过替换此行来获得所需内容:
services.AddAutoMapper(typeof(UserProfile));
有了这些:
services.AddAutoMapperBuilder(builder=>
{
builder.Profiles.Add(新用户配置文件(services.BuildServiceProvider().GetRequiredService());
});
请发布你的代码。帖子已经编辑好了。你也可以发布你的DI设置代码吗?我想看看你在创业课上做了什么。使用IMappingAction
:拯救我的生命!TY有没有办法让它更方便(例如,容器集成)而不是调用provider.GetService()
,关于容器的生命周期?您说过不会将任何服务注入映射配置文件,但是ILogger服务如何使用(…)将映射警告记录在ConstructionUsing()中呢
maps?始终存在一个edgecase:)这取决于您的情况,但如果某些值超出预期范围,则可能在映射完成后记录警告。当然,这可能取决于具体情况。是的,在profile类中注入一些东西感觉有点不对。谢谢你的回复,我会考虑的。这种方法的问题是不能由LINQ提供商翻译<根据AutoMapper文档,代码>ResolveUsing不是受支持的映射选项。如果您尝试,AutoMapper只会抛出System.Exception:无法将其解析为可查询表达式
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddSingleton<IUserManager, UserManager>();
}