asp.net - 存储库模式和 Linq to sql

标签 asp.net linq-to-sql repository design-patterns entities

我正在尝试使用角色表、用户表和具有 userid、roleid 的外部参照表来实现用户身份验证和授权。

为了实现通用存储库以更新角色、插入角色、添加用户、将用户添加到角色、更新用户、更新用户角色、验证用户、将用户 session 添加到审计等,我是否为每个函数编写了单独的函数,或者我可以使用一种用于类似功能的通用方法。 还有一些其他操作,例如将用户加入其他表并根据条件获取前 5 行,使用单一表单插入 3 个表(按键连接)等

我在阅读许多文章和示例时感到困惑,我看到的 bcos 示例除了 CRUD 操作外没有深入实现。

有人可以指导我或指导我找到好的示例/文章吗?

最佳答案

首先,请遵循 Frank Schwieterman 所说的内容。让您的存储库随着使用量的增长而增长。此外,了解并使用 IQueryable 接口(interface)。 L2S、 Entity Framework 、LINQ to nHibernate 以及一些较新的 ORM(如 SubSonic 和 Telerik 的 ORM)都支持 IQueryable 接口(interface)。

如果您需要来自存储库的可变查询,但仍希望在需要时交换 OR 映射器的好处,IQueryable 是一个强大的工具。假设如下:

public class ProductRepository: IProductRepository
{
    public Product GetByID(int id);
    public IList<Product> GetAll();
    public void Insert(Product product);
    public Product Update(Product product);
    public void Delete(Product product);
}

这是一个非常常见的存储库,具有基本的通用方法。随着时间的推移,您可能会得到更多的方法:

public IList<Product> GetByOrder(Order order);
public IList<Product> GetByCategory(Category category);
public IList<Product> GetByQuantityInStock(int quantityInStock);

这也很常见,并且完全可以接受,具体取决于您喜欢如何解决问题。但是,从长远来看,您的存储库可能会变得非常笨重,而且它的界面总是在变化。您还失去了在幕后使用 OR 映射器的真正好处。

您可以保留原始的、简单的存储库界面,但仍然可以为自己提供很大的灵 active ,如果您更改一种方法:

public IQueryable<Product> GetAll();

您的存储库现在返回查询,而不是已检索对象的列表。您现在可以像使用任何其他支持 LINQ 的对象一样自由使用此查询:

var productsWithLowStock = productRepository.GetAll().Where(p => p.Quantity < 10);

var orders = orderRepository.GetAll();
var productsWithOrders = productRepository.GetAll().Where(p => orders.OrderLines.Any(ol => ol.ProductID == p.ProductID));

一旦您开始将 IQueryable 接口(interface)与您的存储库一起使用,您将获得两全其美的优势:围绕较低级别数据访问的可模拟抽象,以及代码中动态查询的强大功能。您可以更深入地理解这个概念,并创建一个实现 IQueryable 本身的基础 Repository 类,这样您就可以消除对 GetAll() 调用的需要,并直接查询存储库(尽管复杂程度不同。)

关于asp.net - 存储库模式和 Linq to sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1573658/

相关文章:

Docker 从其他服务器推送到私有(private)注册表

repository - 我在哪里可以获得 Ubuntu 中 Yum 的存储库列表?

asp.net - 关于使用哪个模式弹出窗口的建议 : ASP. NET AjaxControlToolkit vs jQuery 插件 vs Greybox vs?

javascript - 用户控制范围内的全局 JS 变量?

c# - 比较两个字符串后需要显示更改的文本

linq in 或包含?

c# - 包含数字和字母的orderby()

linq-to-sql - LINQ to SQL - 十进制数据类型截断而不是四舍五入

java - 使用 JPQL 查询在 JPA 中进行查询组合、一对多关系

asp.net - 使用 asp.net 网站优化加载 XAP 文件