我有一个 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) 我通常不会明确调用析构函数。但我正在设计 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 …
我有 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(错误请求)。当我传递有效的人员数据时,它工作正常。
我的问题是:
c# validation asp.net-core asp.net-core-middleware clean-architecture
在我的 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# ×3
asp.net-core ×2
async-await ×1
c++ ×1
class ×1
constructor ×1
destructor ×1
exception ×1
validation ×1