首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Mapster映射到包装类?

如何使用Mapster映射到包装类?
EN

Stack Overflow用户
提问于 2022-05-24 05:35:55
回答 1查看 339关注 0票数 1

基于我的项目,我需要为“IFormFile”创建一个包装器,实际上我为此创建了一个“AppFileProxy”类和“IAppFile”接口:

IAppFile.cs:

代码语言:javascript
复制
public interface IAppFile
{
    string Name { get; }

    string FileName { get; }

    string ContentType { get; }

    long Length { get; }

    void CopyTo(Stream target);
    Task CopyToAsync(Stream target, CancellationToken cancellationToken = default);
    Stream OpenReadStream();
}

AppFileProxy.cs:

代码语言:javascript
复制
public class AppFileProxy : IAppFile
{
    private readonly IFormFile _formFile;

    public AppFileProxy(IFormFile formFile)
    {
        _formFile = formFile ?? throw new ArgumentNullException(nameof(formFile));
    }

    public string Name => _formFile.Name;

    public string FileName => _formFile.FileName;

    public string ContentType => _formFile.ContentType;

    public long Length => _formFile.Length;

    public void CopyTo(Stream target)
    {
        _formFile.CopyTo(target);
    }

    public Task CopyToAsync(Stream target, CancellationToken cancellationToken = default)
    {
        return _formFile.CopyToAsync(target, cancellationToken);
    }

    public Stream OpenReadStream()
    {
        return _formFile.OpenReadStream();
    }
}

现在,我希望通过在动作控制器中使用IFormFile Mapster将“”映射到“IAppFile”,如下所示:

CompanyDto.cs:

代码语言:javascript
复制
public class CompanyDto
{
    public string Name { get; set; }
    public IFormFile Logo { get; set; }
}

CompanyMapDto.cs:

代码语言:javascript
复制
public class CompanyMapDto : IRegister
{
    public int Id { get; set; }
    public string Name { get; set; }

    public IAppFile Logo { get; set; }

    public void Register(TypeAdapterConfig config)
    {
        config.ForType<CompanyDto, CompanyMapDto>()
                .Map(dest => dest.Logo, src => new AppFileProxy(src.Logo));
    }
}

行动控制器:

代码语言:javascript
复制
[HttpPost]
[Route("[controller]/[action]")]
public async Task<IActionResult> AddCompanyWithLogo([FromForm]CompanyDto dto)
{
    CompanyMapDto company = dto.Adapt<CompanyMapDto>();

    var stream = company.Logo.OpenReadStream();

    return Ok();
}

但是,当我调用操作时,我得到了OpenReadStream()方法的异常错误:

代码语言:javascript
复制
System.NotImplementedException: The method or operation is not implemented.
   at GeneratedType_1.OpenReadStream()
   at MapsterInDotNet.Controllers.CompaniesController.AddCompanyWithLogo(CompanyDto dto) in C:\Users\Mohsen\source\repos\UseMapsterInDotNet\MapsterInDotNet\MapsterInDotNet\Controllers\CompaniesController.cs:line 52
   at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.TaskOfIActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeInnerFilterAsync>g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|20_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
   at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
   at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
   at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

我该怎么解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-24 14:39:03

井。我设法让它运转起来了。您必须显式地配置从IAppFileIFormFile的映射。

因此,而不是您的配置:

代码语言:javascript
复制
config.ForType<CompanyDto, CompanyMapDto>()
    .Map(dest => dest.Logo, src => new AppFileProxy(src.Logo));

用这个:

代码语言:javascript
复制
TypeAdapterConfig<IFormFile, IAppFile>.ForType() // Or NewConfig()
    .MapWith(src => new AppFileProxy(src));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72357653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档