小编Tib*_*tim的帖子

如果方法是同步的,则保留 Task 和 Task.FromResult 还是完全删除 Task-stuff?

我有一个 Web API 控制器(ASP.NET Core 5)。我的一些 API 是异步的,而其中一些不是。接下来我的问题是:public **Task<T>** WebApiMethod + Task.FromResult()如果我的方法是同步的,在 Web API 控制器中使用有什么好处吗?

例如:

public Task<string> GetSomeData()
{
    // some synchronous processing...
    return Task.FromResult(result);
}
Run Code Online (Sandbox Code Playgroud)

我应该将上面的示例代码变成这样吗?

public string GetSomeData()
{
    // some synchronous processing...
    return result;
}
Run Code Online (Sandbox Code Playgroud)

c# task-parallel-library async-await

4
推荐指数
1
解决办法
69
查看次数

在 C++ 中从构造函数中显式调用析构函数是不好的做法吗?

我通常不会明确调用析构函数。但我正在设计 TCP 服务器类,它看起来像这样:

class Server {
public:
    Server() {
        try {
            WSADATA wsaData;
            if (WSAStartup(MAKEWORD(2, 2), &wsaData))
                throw std::runtime_error("WSAStartup function failed.");
            ...

            if ((m_scListener = socket(pAddr->ai_family, pAddr->ai_socktype, pAddr->ai_protocol)) == INVALID_SOCKET)
                throw std::runtime_error("'socket' function failed.");
            ...
        }
        catch (std::exception& ex) {
            this->~Server();
            throw;
        }
    }

    ~Server() {
        if (m_scListener != INVALID_SOCKET) {
            closesocket(m_scListener);
            m_scListener = INVALID_SOCKET;
        }
        WSACleanup();
    }
private:
    SOCKET m_scListener = INVALID_SOCKET;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码是否被认为是不好的做法或设计?什么是推荐的设计方式?我是这样写的,因为构造函数不能返回NULL。我应该将构造函数设为私有,并编写创建 Server 类实例的静态方法吗?

===== 更新 =====

OK,总结一下答案,我得出了这个结论:

  • 显式调用析构函数通常是一个坏主意,即使它按预期工作,这是不寻常的,并且将处理您的代码的其他 C++ 程序员可能会对这种方法感到困惑。所以最好避免显式调用析构函数。

  • 将我原来的 RAII 类分解为微型 RAII 类看起来是一个很好的解决方案。但恐怕我的真实代码中有太多 API …

c++ constructor destructor exception class

3
推荐指数
1
解决办法
143
查看次数

如何将 ASP.NET Core 5 Web API 控制器操作的失败模型验证结果包装到另一个类中并返回正常响应

我有 ASP.NET Web API 控制器和一些操作(方法)。让我们这样说:

[HttpPost]
public async Task<ActionResult> SavePerson([FromBody]PersonDto person)
{
    await _mediatr.Send(new SavePerson.Command(person));
    return Ok();
}
Run Code Online (Sandbox Code Playgroud)

PersonDto看起来像这样

public record PersonDto([Required, MinLength(3)]string Name, int? Age);
Run Code Online (Sandbox Code Playgroud)

当我使用无效的人员数据(Name.Length < 3 等)调用 Web API 操作“SavePerson”时,ASP.NET Core 模型绑定验证会中断执行并返回 400(错误请求)。当我传递有效的人员数据时,它工作正常。

我的问题是:

  1. 我怎样才能捕获这个模型绑定验证结果(400 Bad Request)并将其转换为不同的格式,以便我们的前端开发人员会高兴?
  2. 我应该在 Web API 层验证我的 DTO (PersonDto) 还是最好在 MediatR 命令处理程序中验证它?我正在努力遵循鲍勃叔叔的清洁架构。我有域、应用程序、基础设施、Web API。我的 MediatR CQRS 处理程序放置在应用程序层中。

c# validation asp.net-core asp.net-core-middleware clean-architecture

1
推荐指数
1
解决办法
5872
查看次数

ASP.NET Core 依赖注入单个聚合类而不是多个单独的构造函数注入

在我的 ASP.NET Core Web API 中,我有几个控制器在它们的构造函数中接受超过 4-5 个参数,这对我来说不太好。我正在考虑创建一个聚合类,其中包含我经常使用的所有单独对象。我的意思是,例如,而不是这个:

public SomeController : Controller
{
    public SomeController(
        IService1 service1,
        IService2 service2,
        Config1 config1,
        Config2 config2)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

写这样的东西:

// of course registered in DI services.AddSingleton<MyToolkit>()
public class MyToolkit 
{
    public MyToolkit(
        IService1 service1,
        IService2 service2,
        Config1 config1,
        Config2 config2)
    {
        ...
    }

    public IService1 Service1 { get; }
    public IService2 Service2 { get; }
    public Config1 Config1 { get; }
    public Config2 Config2 { get; }
}

public SomeController : Controller …
Run Code Online (Sandbox Code Playgroud)

c# design-patterns dependency-injection asp.net-core

0
推荐指数
1
解决办法
48
查看次数