查找使用DI的EF数据访问代码的主页

时间:2017-09-06 22:18:36

标签: c# entity-framework dry

这里有一些代码归结为从一堆不同位置调用的方法:

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个实体。

这段代码应该在哪里生效?

据我所知,经常使用扩展方法来帮助这样的情况 - 实际上你会看到我已经在做那种情况了。但是,在这种情况下,因为它使用了几个服务(IPermissionCheckerIMembershipService),我需要将它们作为参数传递,这看起来有点难看。

另一个显而易见的解决方案是提供单独的服务,仅用于检索这些书籍。该服务将保留上述方法,并将注入到需要它的地方。这也感觉有点不对 - 也许是因为我发现很难描述这项服务的唯一责任不仅仅是“放置这种方法的地方”。我当然不希望服务转入PlaceToPutReusedQueriesService,我也不想为了检索某些数据集而最终拥有大量的服务。试图避免这些事情是否有效?

非常感谢任何关于如何进行的想法。

1 个答案:

答案 0 :(得分:0)

另一种解决方案是使用查询对象模式。

请参阅article以获得更好的解释。