C# 在Automapper的IValueConverter中访问源实体/模型

C# 在Automapper的IValueConverter中访问源实体/模型,c#,asp.net-core,automapper,asp.net-core-webapi,C#,Asp.net Core,Automapper,Asp.net Core Webapi,我正在尝试访问IValueConverter中源模型的属性,但不知道如何执行此操作。 我正在将Project映射到ProjectWithUrl ProjectWithUrl使用转换器projectedtourlconverter进行转换,该转换器将Project.Id作为源参数,并返回在ProjectWithUrl.Url中设置的字符串 以下是个人资料: CreateMap<Domain.Entities.Project, ProjectWithUrl>()

我正在尝试访问IValueConverter中源模型的属性,但不知道如何执行此操作。 我正在将
Project
映射到
ProjectWithUrl

ProjectWithUrl
使用转换器
projectedtourlconverter
进行转换,该转换器将
Project.Id
作为源参数,并返回在
ProjectWithUrl.Url
中设置的字符串

以下是个人资料:

CreateMap<Domain.Entities.Project, ProjectWithUrl>()
            .ForMember(x => x.Url, x => x.ConvertUsing<ProjectIdToUrlConverter, string>(y => y.Id))
            ;
CreateMap()
.ForMember(x=>x.Url,x=>x.ConvertUsing(y=>y.Id))
;
以下是值转换器:

internal class ProjectIdToUrlConverter : IValueConverter<string, string>
{
    private readonly IMediator _mediator;

    public ProjectIdToUrlConverter(IMediator mediator)
    {
        _mediator = mediator;
    }

    public string Convert(string sourceMember, ResolutionContext context)
    {
        //I need to check if Project.SomeProperty (string) is null or not.

        //Get Url using Project.Id.
        Task<string> result = _mediator.Send(new GetProjectAudioUrlQuery { Id = sourceMember });
        return result.Result;
    }
}
内部类ProjectdTourlConverter:IValueConverter
{
专用只读IMediator\u中介;
公共项目资源转换器(IMediator调解器)
{
_调解人=调解人;
}
公共字符串转换(字符串源成员、ResolutionContext上下文)
{
//我需要检查Project.SomeProperty(字符串)是否为null。
//使用Project.Id获取Url。
任务结果=_mediator.Send(新的GetProjectAudioUrlQuery{Id=sourceMember});
返回结果。结果;
}
}
那么,如何访问
Project.SomeProperty
内部
IValueConverter

注意:我已经在传递源成员。我需要访问其他属性


我必须使用类型转换器吗?

添加此答案,以便其他登陆此处的人员可以轻松找到解决方案

我能够使用IValueResolver实现而不是IValueConverter访问源实体/模型的所有属性

感谢卢西恩为我指引了正确的方向

我实现了
IValueResolver
接口,该接口注入整个源模型,而不仅仅是源成员

在使用IValueResolver之前,必须了解它特定于一个模型/实体,这意味着您不能将其用于其他模型,而IValueConverter可用于多个模型

以下是我的解决方案:

internal class ProjectIdToUrlConverter : IValueResolver<Domain.Entities.Project, ProjectWithUrl, string>
{
    private readonly IMediator _mediator;

    public ProjectIdToUrlConverter(IMediator mediator)
    {
        _mediator = mediator;
    }

    public string Resolve(Domain.Entities.Project source, ProjectWithUrl destination, string destMember, ResolutionContext context)
    {
        //Proceed only if SomeProperty is not null.
        if (source.SomeProperty != null)
        {
            //Returns Url if the file is present in the blob.
            Task<string> result = _mediator.Send(new GetProjectAudioUrlQuery { Id = source.Id });
            return result.Result;
        }
        else
        {
            //Return null if the SomeProperty is null.
            
            return null;
        }
    }
}
内部类ProjectdTourlConverter:IValueResolver
{
专用只读IMediator\u中介;
公共项目资源转换器(IMediator调解器)
{
_调解人=调解人;
}
公共字符串解析(Domain.Entities.Project源、ProjectWithUrl目标、string destMember、ResolutionContext上下文)
{
//仅当SomeProperty不为null时才继续。
if(source.SomeProperty!=null)
{
//如果blob中存在文件,则返回Url。
任务结果=_mediator.Send(新的GetProjectAudioUrlQuery{Id=source.Id});
返回结果。结果;
}
其他的
{
//如果SomeProperty为null,则返回null。
返回null;
}
}
}
并且映射配置为:

CreateMap<Domain.Entities.Project, ProjectWithUrl>()
            .ForMember(x => x.Url, x => x.MapFrom<ProjectIdToUrlConverter>())
            ;
CreateMap()
.ForMember(x=>x.Url,x=>x.MapFrom())
;

您需要一个值解析器。它有目标,但我需要源。公共字符串解析(字符串源、带有URL目标的项目、字符串destMember、ResolutionContext上下文);查看文档中的示例。如果您在
映射
时间使用
上下文.项
显式传递所需的值,则仍然可以使用值转换器。