Repository模式和LINQ to SQL(Repository Pattern and Li

2019-08-18 12:07发布

我试图实现用户身份验证和授权使用角色表,用户表,并具有外部参照表的用户ID,角色ID。

为了实现通用repoistory更新角色,插入角色,添加用户,添加用户角色,更新用户,更新用户角色,认证用户,增加用户会话审计等我一定写单独的功能,对每个或我可以使用一个通用的方法对于类似的功能。 还有像接合用户到其他表,并获得基于条件顶部5行,在表3(接合上的键)插入使用单一的形式等一些其它操作

我很困惑阅读了许多文章和样品,样品BCOS我看到走不进深,除了实行CRUD操作。

有人可以指导我或者指导我一个很好的样本/文章?

Answer 1:

首先,遵循什么弗兰克Schwieterman说。 让你的资料库成长为他们的使用增长。 此外,了解和利用的IQueryable接口。 L2S,实体框架,LINQ NHibernate的,和一些新的ORM的像亚,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);
}

这是一个很常见的存储库,与裸露的骨头常用的方法。 随着时间的推移,你最终可能会和一帮更多的方法:

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

这也是很常见的,取决于你怎么样来解决这个问题,完全可以接受。 然而,从长远来看,你的资料库可以增长到一个笨拙的大小,并且它的界面将永远改变。 你也失去使用幕后的OR映射器的真正好处。

你可以保持原来的,简单的存储库接口,但仍然提供自己一个很大的灵活性,如果你改变了一个方法:

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接口,您获得两全其美的:在你的低层次的数据访问的mockable抽象,以及动态查询的代码内的功率。 你可以把这个概念有点远,创建一个实现IQueryable的本身就是一个基础库类,可以让你消除对GETALL()调用的需要,干脆直接查询库(与另一个复杂的程度虽然)。



Answer 2:

理想情况下,你不应该猜测存储库的要求。 这样做的一个方法是编写首先使用存储库,根据需要扩展存储库的接口的代码。 如果你写单元测试提供库测试双打这是可以实现的。



Answer 3:

LINQ2SQL是ActiveRecord的模式的实现是有点反模式,所以如果你想使用存储库模式,那么你一定不能使用LINQ2SQL但别的地方可能有顾虑的实体进行数据访问的分离(单独的类和单独的类)

或者也许你能以某种方式,我不知道这件事:d



文章来源: Repository Pattern and Linq to sql