添加新的应用程序服务

时间:2018-10-09 16:38:42

标签: c# asp.net-core swagger swagger-ui aspnetboilerplate

  

在阅读this post之前,请知道我已经看过这篇文章,并且...问题几乎是相同的,并且我已经尝试了解决方案。因此,此帖子不会重复。

我们使用了ASP.NET Boilerplate启动模板。 我们已经开发了一些应用程序服务,其结构如下:

public interface IFooAppService : 
    IAsyncCrudAppService<FooDto, Guid, GetAllFooDto, CreateFooDto, UpdateFooDto>
    // Abp.Application.Services.IAsyncCrudAppService<...>
{
}

[AbpAuthorize("Authorize.Foo")]
public class FooAppService : 
    AsyncCrudAppService<Foo, FooDto, Guid, FooFilterInput, CreateFooDto, FooDto>,
    IFooAppService
{
    private readonly BarManager _barManager;
    public FooAppService(IBarManager barManager, IRepository<Foo, Guid> repository)
        : base (repository)
    {
        _barManager = barManager;
    }

    public override async Task<FooDto> Create(CreateFooDto input)
    {
        // create with repository
    }

    // other overridden Actions and Foo interface implementation
}

一切都与here上提供的文档一致。

所有方法都能正常工作,我可以使用所有Swagger功能。配置似乎还可以(我们为ABP注入了一些后JavaScript,等等)。

最初,我有以下版本:

  • Microsoft.AspNetCore:2.0.1
  • Microsoft.EntityFrameworkCore:2.0.1
  • Abp.AspNetCore:3.6.2
  • Swashbuckle.AspNetCore:1.1.0

我们有 385 个API。

我添加了一个新的AppService,承诺及其管理器,Dtos等。

那一刻,当我启动并大摇大摆时,浏览器崩溃并显示一条消息,询问我是否要停止脚本(IE,Edge,Firefox,Chrome等)。

在调试模式下,我没有任何有关引发异常的信息。

尝试:

  1. 更新Swashbuckle.AspNetCore NuGet软件包(所有版本:1.2、2.X和3.0.0)

    • 在1.X版中,我遇到了同样的问题。
    • 在2.5版中,不会显示UI。
    • 在其他版本中,显示UI,除新方法“承诺”外,我可以使用所有方法。当我单击鼠标悬停时,我只有旋转器...浏览器冻结,并询问我是否要停止脚本或等待。 Swagger UI freezes

在Chrome上,Chrome引发错误: Chrome debugging catches an exception

  1. 删除承诺的替代方法

以防我的代码在重写方法内出错。

[AbpAuthorize("Authorize.Commitments")]
public class CommitmentAppService : 
    AsyncCrudAppService<Commitment, CommitmentDto, Guid, CommitmentFilterInput, CreateCommitmentDto, UpdateCommitmentDto>,
    ICommitmentAppService
{
    private readonly ICommitmentManager _commitmentManager;
    private readonly IFundManager _fooManager;
    private readonly ILimitedPartnerManager _barManager;

    public CommitmentAppService(
        ICommitmentManager commitmentManager,
        IFooManager fooManager,
        IBarManager barManager,
        IOneRepository<Commitment, Guid> repository)
        : base(repository)
    {
        _commitmentManager = commitmentManager;
        _fooManager = fooManager;
        _barManager = barManager;
        _commitmentManager = commitmentManager;
    }
    // nothing here
}

结果相同。

  1. 仅使用一个DTO (CommitmentDto),而不是一组DTO CommitmentDto,CreateCommitmentDto,UpdateCommitmentDto,...

    • AsyncCrudAppService<Commitment, CommitmentDto, Guid>在哪里定义了实体,其DTO和PK类型
    • AsyncCrudAppService<Commitment, CommitmentDto, Guid, CommitmentFilterInput>,其中定义了实体,其默认DTO,PK类型和过滤器输入DTO
    • AsyncCrudAppService<Commitment, CommitmentDto, Guid, CommitmentFilterInput, CommitmentDto>,其中定义了实体,其默认DTO,PK类型,过滤器输入DTO和创建实体DTO
    • AsyncCrudAppService<Commitment, CommitmentDto, Guid, CommitmentFilterInput, CommitmentDto, CommitmentDto>,其中定义了实体,其默认DTO,PK类型,过滤器输入DTO,创建实体DTO和更新实体DTO

结果相同。

  1. 使用其他AsyncCrudAppService实现

    • AsyncCrudAppService<Commitment, CommitmentDto, Guid>在何处定义实体,其DTO和PK类型
    • AsyncCrudAppService<Commitment, CommitmentDto, Guid, CommitmentFilterInput>,其中定义了实体,其默认DTO,PK类型和过滤器输入DTO
    • AsyncCrudAppService<Commitment, CommitmentDto, Guid, CommitmentFilterInput, CreateCommitmentDto>,其中定义了实体,其默认DTO,PK类型,过滤器输入DTO和创建实体DTO
    • AsyncCrudAppService<Commitment, CommitmentDto, Guid, CommitmentFilterInput, CreateCommitmentDto, UpdateCommitmentDto>,其中定义了实体,其默认DTO,PK类型,过滤器输入DTO,创建实体DTO和更新实体DTO

结果相同。

  1. 使用编辑器进行验证

Swagger(我知道OpenApi ...)在https://editor.swagger.io/提供了在线编辑器

我已经复制了swagger.json并将其粘贴到编辑器中。 我对语义有一些错误(我认为这是从Json转换为Yaml引起的)。

  

路径中的语义错误./api/services/app/Foo/GetAll.get.responses.200.schema.$ref   $ ref值必须是符合RFC3986的百分比编码URI   跳到第234行

     

路径./api/services/app/Foo/GetAll.get.security.0.0上的语义错误   安全范围定义Funds.BankAccounts无法解析   跳到第240行

对于CommitmentAppService,没有特殊错误。除了承诺方法,我可以展开所有项目...浏览器崩溃,等等等等

  1. 重命名对Toto的承诺

  2. 删除一些方法以验证Swagger的API数量不是太大

  3. 在Azure API管理中导入swagger.json 我可以扩展所有方法,甚至是Commitment方法...但是我不知道如何使用 my 数据库(这不是我的目标,我希望在本地调试)。

  4. 清洁构造函数 ...也许我注入的项目之一不正确?

public CommitmentAppService(IRepository<Commitment, Guid> repository) 
: base(repository)
{ /**/ }

没有...


如果有人有解决方案...

1 个答案:

答案 0 :(得分:0)

都是我的错!

我需要添加Commitment及其Dtos代码以了解我在哪里犯了错...

[Table("Commitment")]
public class Commitment : FullAuditedEntity<Guid>, 
{
    public string Property1 { get; set; }
    public Foo Foo { get; set; }
    public Guid FooId { get; set; }
}

[AutoMapFrom(typeof(Commitment))]
[AutoMapTo(typeof(Commitment), MemberList = AutoMapper.MemberList.Source)]
public class CommitmentDto : EntityDto<Guid>
{
    public string Property1 { get; set; }
    public Foo Foo { get; set; }
    public Guid FooId { get; set; }
}

我在CommitmentDto中使用了 entity 对象,而不是Dtos ... 实际上,我需要使用FooDto(而不是Foo )在CommitmentDto中。