![](/img/trans.png)
[英]Proper Implementation of Unit of Work in Existing Repository Pattern in ASP.NET Core
[英]Proper implementation NRT in ASP.NET Core
我对作为ASP.NET Core MVC中C#8.0的一部分的可为空的引用类型有一些疑问:
当存在带有字符串参数的动作( public IActionResult Index(string message)
)时,如果未传递给动作,则参数仍可以为null。 该问题的官方解决方案是什么? 还需要检查null吗?
当存在简单的可变模型时,如何正确地将其修改为NRT? 例如Scott Allen( https://odetocode.com/blogs/scott/archive/2019/08/07/think-twice-before-returning-null.aspx )建议创建NullUser
。 这是正确的吗? Maybe<T>
声音也不适合NRT。 可变和不可变模型的官方解决方案是什么?
public class User { public int UserId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public IEnumerable<Message> Messages { get; set; } } public class Message { public int MessageId { get; set; } public string Text { get; set; } }
现在,当我想从集合中提取某些东西时(并检查null后),我经常使用FirstOrDefault
。 集合不是空的,但是可以为空,现在当要使用First
会引发异常,这是一个不好的原因,这是一个操作,并且想要创建不正确的响应而无需尝试( https://softwareengineering.stackexchange.com/questions/387674/ c-8非空引用和try-pattern )并尝试捕获。 同样, Maybe<T>
听起来不是解决方案。 这个问题的官方解决方案是什么?
我知道我不需要避免空值,但希望将其最小化并遵循NRT cuz,它的声音像未来的歌曲
您使这太困难了。 可空的引用类型只是编译器提示-一种更明确地了解您实际希望执行的代码片段的方式。 确实并没有改变任何事情。
例如,对于动作参数的情况。 如果您的string
参数可以为null(不应该为null,但是可以为-这很重要),那么它应该为string?
代替。 动作参数几乎总是可选的,因此它们肯定可以为空。 唯一的例外是路径参数,因为除非路径参数中充满某些东西,否则您实际上不会执行此操作。 例如,假设它是通过查询字符串填充的,那么它肯定可以为null,您应该使用string?
那里。 如果要确保它不为null,则需要使用标准的null保护:
if (message == null)
return BadRequest();
可变性也与此无关。 同样,您要做的只是明确说明引用是否可以为null。 这也适用于您的第三个问题。 查询始终有可能与数据库中的行不匹配,然后返回空值。 使用First
不能确保返回实际值。 在这种情况下,它只会引发异常。 在这种情况下,您应该继续使用FirstOrDefault
,还是使用User?
/ Message?
(或只是var
),然后像往常一样执行null检查。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.