Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 如何在AutoMapper配置文件类中注入服务_Asp.net Core_Automapper - Fatal编程技术网

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>();
}