rs.*_*rs. 3 asp.net entities design-patterns repository linq-to-sql
我正在尝试使用角色表,用户表和具有userid,roleid的外部参照表来实现用户身份验证和授权.
用于实现通用repoistory更新角色,插入角色,添加用户,添加用户到角色,更新用户,更新用户角色,验证用户,添加用户会话到审计等我是否为每个编写单独的函数或者我可以使用一个通用方法用于类似的功能.还有一些其他操作,例如将用户连接到其他表并根据条件获得前5行,使用单个表单插入3个表(加入键)等
我很困惑阅读许多文章和样本,我看到的bcos样本除了CRUD操作外没有深入实现.
有人可以指导我或指导我一个好的样品/文章吗?
首先,请遵循Frank Schwieterman的说法.随着使用量的增长,让您的存储库增长.此外,了解并使用IQueryable接口.L2S,以及实体框架,LINQ到nHibernate,以及一些新的ORM,如SubSonic和Telerik的ORM,都支持IQueryable接口.
如果您需要来自存储库的可变查询,但仍需要在需要时交换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);
}
Run Code Online (Sandbox Code Playgroud)
这是一个非常常见的存储库,使用简单的常用方法.随着时间的推移,您最终可能会遇到更多方法:
public IList<Product> GetByOrder(Order order);
public IList<Product> GetByCategory(Category category);
public IList<Product> GetByQuantityInStock(int quantityInStock);
Run Code Online (Sandbox Code Playgroud)
这也很常见,取决于您希望如何处理问题,完全可以接受.但是,从长远来看,您的存储库可能会变得难以处理,其界面将始终在变化.您还失去了在幕后使用OR映射器的真正好处.
您可以保留原始的,简单的存储库界面,但如果您更改一个方法,仍然可以提供很多灵活性:
public IQueryable<Product> GetAll();
Run Code Online (Sandbox Code Playgroud)
您的存储库现在返回一个查询,而不是已检索对象的列表.您现在可以像任何其他启用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));
Run Code Online (Sandbox Code Playgroud)
一旦开始将IQueryable接口与存储库一起使用,就可以获得两全其美的优势:围绕低级数据访问的可模拟抽象,以及代码中动态查询的强大功能.您可以将概念更进一步,并创建一个实现IQueryable本身的基本Repository类,允许您消除对GetAll()调用的需要,并直接查询存储库(尽管具有另一种复杂程度).