- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有没有办法减少/消除业务层中不断重复的用户访问检查(或其他一些检查)?
让我们考虑以下示例:具有一个实体 BlogPost
的简单 CRUD 应用程序:
public class BlogPost
{
public int Id { get; set; }
public string Title { get; set; }
public string Body { get; set; }
public int AuthorId { get; set; }
}
在修改或删除实体之前的 PUT/DELETE 请求中,我需要检查发出请求的用户是否是 BlogPost 的作者,以便允许他删除/编辑它。
所以无论是在 UpdateBlogPost
还是 DeleteBlogPost
中,虚构的 BlogPostService
我都必须这样写:
var blogPostInDb = _blogPostRepository.GetBlogPost();
if(blogPostInDb == null)
{
// throw exception or do whatever is needed
}
if(blogPostInDb.AuthorId != _currentUser.Id)
{
// throw exception etc...
}
这种代码对于 Update
和 Delete
方法以及将来可能添加的其他方法都是相同的,并且对于所有实体都是相同的。
有什么方法可以减少或完全消除这种重复?
我仔细考虑并提出了以下解决方案,但它们并不能完全让我满意。
第一个解决方案
使用过滤器。我们可以创建一些自定义过滤器,如 [EnsureEntityExists]
和 [EnsureUserCanManageEntity]
但是这样我们在 API 层中传播了一些业务逻辑并且它不够灵活,因为我们需要为每个实体创建这样的过滤器。也许可以使用反射来制作某种通用过滤器。
此外 这种方法还有另一个问题,假设我们制作了这样的过滤器来检查我们的规则。我们从数据库中获取实体,进行检查,抛出异常和所有这些东西,然后让 Controller 方法执行。但是在服务层,我们需要再次获取实体,所以我们要往返 db 两次。也许我对这个问题想得太多了,考虑到可以应用缓存这一事实,进行 2 次往返就可以了。
第二种方案
因为我使用的是 CQRS(或至少是某种类型的),所以我有 MediatR图书馆,我可以利用 Pipeline Behaviors甚至通过变异 TRequest
将获取的实体进一步传递到管道中(我不想这样做)。此解决方案需要一些通用接口(interface),以便所有请求能够检索实体的 ID。往返问题也适用于此。
public interface IBlogPostAccess
{
public int Id { get; set; }
}
public class ChangeBlogPostCommand: IRequest, IBlogPostAccess
{
// ...
}
public class DeleteBlogPostCommand: IRequest, IBlogPostAccess
{
// ...
}
public class BlogPostAccessBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse> where TRequest : IBlogPostAccess
{
// all nessesary stuff injected via DI
public BlogPostAccessBehavior()
{
}
public async Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate<TResponse> next)
{
var blogPostInDb = _blogPostRepository.GetBlogPost(request.Id);
if(blogPostInDb == null)
{
// throw exception or do whatever is needed
}
if(blogPostInDb.AuthorId != _currentUser.Id)
{
// throw exception etc...
}
return await next();
}
}
第三种方案
创建类似请求上下文服务的东西。以一种非常简单的方式,它将是一个字典,它将在我们可以存储数据的请求中持久化(在这种情况下,我们在过滤器/管道中获取的 BlogPost)。这看起来很蹩脚,让我想起了 ASP.NET MVC 中的 ViewBag
。
第四种方案
它比解决方案更增强,但我们可以使用 GuardClause
或扩展方法来减少 if
语句的嵌套。
同样,也许我对这个问题想得太多了,或者这根本不是问题,或者那是设计问题。任何帮助,想法表示赞赏。
最佳答案
如果您担心许多数据库调用,您可以尝试使用类似 LazyCache https://github.com/alastairtree/LazyCache 的方法缓存每个请求返回的对象。
我不建议跨请求缓存...
对于代码组织,我建议将授权逻辑提取到一个单独的方法中,并在每个请求中调用该方法。好处是如果逻辑发生变化,那么只需要在一个地方更新它。
例如这样的事情:
bool canEdit(userId){
var user = getUserByUserId(userId);
if(user.IsAdmin) return true;
//depending on where this method lives might have access to blogpost here
if(_blogPost.AuthorId == userId) return true;
return false;
}
关于c# - 减少/删除 ASP.NET Core 中重复的业务逻辑检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67992608/
创建使用.NET框架的asp.net页面时,访问该页面的客户端是否需要在其计算机上安装.NET框架? IE。用户访问www.fakesite.com/default.aspx,如果他们没有安装框架,他
我阅读了很多不同的博客和 StackOverflow 问题,试图找到我的问题的答案,但最后我找不到任何东西,所以我想自己问这个问题。 我正在构建一个应用程序,其中有一个长时间运行的工作线程,它执行一些
已锁定。这个问题及其答案是locked因为这个问题是题外话,但却具有历史意义。目前不接受新的答案或互动。 我一直想知道为什么微软为这样一个伟大的平台选择了一个如此奇怪的、对搜索引擎不友好的名称。他们就
.Net Framework .Net .NET Standard的区别 1、.NET Framework 在未来.NET Framework或许成为过去时,目前还是有很多地方在使用的。这一套
如果有选择的话,您会走哪条路? ASP.NET Webforms + ASP.NET AJAX 或 ASP.NET MVC + JavaScript Framework of your Choice
我有一个 Web 服务,它通过专用连接通过 https 使用第三方 Web 服务,我应用了 ServicePointManager.ServerCertificateValidationCallbac
为什么我应该选择ASP.NET Web Application (.NET Framework)而不是ASP.NET Core Web Application (.NET Framework)? 我在
我在网络上没有找到任何关于包含 .NET Standard、.NET Core 和 .NET Framework 项目的 .NET 解决方案的公认命名约定。 就我而言,我们在 .NET 框架项目中有以
.NET Compact 是 .NET 的完美子集吗? 假设我考虑了屏幕大小和其他限制并避免了 .NET Compact 不支持的类和方法,或者 .NET Compact 是一个不同且不兼容的 GUI
我已经阅读了所有我能找到的关于 connectionManagement 中的 maxconnection 设置的文章:即 http://support.microsoft.com/kb/821268
我现在正在使用asp.net mvc,想知道使用内置的Json或 Json.Net哪个是更好的选择,但我不确定一个人是否比另一个人有优势。 另外,如果我确实选择沿用Json.Net的路线,那么我应该选
在 Visual Studio 中,您至少可以创建三种不同类型的类库: 类库(.NET Framework) 类库(.NET 标准) 类库(.NET Core) 虽然第一个是我们多年来一直使用的,但我
.NET 和 ASP.NET 之间有什么区别?它们有什么关系? 最佳答案 ASP.Net 基于 .Net 框架构建,提供有关 Web 开发的附加功能。 你可以去看看wikipedia article
在安装更高版本(3.0)之前,我需要安装.net框架1.1和2.0吗?或者单独安装 3.0 框架就足够了,并为在早期框架版本上编写的软件提供支持?谢谢 ,丽然 最佳答案 不,您不必安装以前的框架。 我
我正在开发一个项目,人们可以“更新”类别,例如更改类别的名称。我收到以下消息 This is called after clicking update 按钮 with the SQL statemen
.NET 类 System.Net.CookieContainer 线程安全吗? --更新:交 key 答复-- 是否有任何方法可以确保异步请求期间修改的变量(即 HttpWebRequest.Coo
我正在使用 JScript.NET 在我编写的 C# WinForms 应用程序中编写脚本。它工作得很好,但我只是尝试在脚本中放置一些异常处理,但我无法弄清楚如何判断我的 C# 代码抛出了哪种类型的异
我需要你的帮助, 比如我有一个小数类型的变量,我想这样取整。 例如 3.0 = 3 3.1 = 4 3.2 = 4 3.3 = 4 3.4 = 4 3.5 = 4 3.6 = 4 3.7 = 4 3.
我使用过这样的代码:http://msdn.microsoft.com/en-us/library/dw70f090.aspx在 ASP.NET 中工作之前访问数据库(2-3 年前)。我没有意识到我正
自 ConfigurationManager .NET Standard 中不存在,检索正在执行的程序集的应用程序设置的最佳方法是什么,无论是 web.config或 appSettings.{env
我是一名优秀的程序员,十分优秀!