这里有一些代码归结为从一堆不同位置调用的方法:
private async Task<IQueryable<Book>> GetAllBooksWithPermissionToView(MyDbContext context)
{
var currentUser = await _membershipService.GetCurrentUser<Publisher>(context);
var books = context.Books.AsQueryable();
var canViewAllBooks = _permissionChecker.DoesUserHavePermission(context, PermissionId.CanViewOtherPublishersBooks);
if (!canViewAllBooks)
books = books.WhereUserIsPublishingBook(currentUser.UserId);
return books;
}
这里我正在检索当前用户有权访问的Book
个实体。
这段代码应该在哪里生效?
据我所知,经常使用扩展方法来帮助这样的情况 - 实际上你会看到我已经在做那种情况了。但是,在这种情况下,因为它使用了几个服务(IPermissionChecker
和IMembershipService
),我需要将它们作为参数传递,这看起来有点难看。
另一个显而易见的解决方案是提供单独的服务,仅用于检索这些书籍。该服务将保留上述方法,并将注入到需要它的地方。这也感觉有点不对 - 也许是因为我发现很难描述这项服务的唯一责任不仅仅是“放置这种方法的地方”。我当然不希望服务转入PlaceToPutReusedQueriesService
,我也不想为了检索某些数据集而最终拥有大量的服务。试图避免这些事情是否有效?
非常感谢任何关于如何进行的想法。