Linq to sql linq到sql查询拦截器
我正在考虑实现一些LINQ到SQL,但我很难看到我们将如何添加访问控制业务规则,例如客户a只能查看他们的订单。 在ado.net data services中,查询转接器完全按照我的要求进行操作,并且可以查看如何检查更新/插入/删除,但是否有类似的功能:Linq to sql linq到sql查询拦截器,linq-to-sql,interceptor,Linq To Sql,Interceptor,我正在考虑实现一些LINQ到SQL,但我很难看到我们将如何添加访问控制业务规则,例如客户a只能查看他们的订单。 在ado.net data services中,查询转接器完全按照我的要求进行操作,并且可以查看如何检查更新/插入/删除,但是否有类似的功能: [QueryInterceptor("Orders")] public IQueryable<Orders> OnQueryOrders(IQueryable<Orders> orderQuery) {
[QueryInterceptor("Orders")]
public IQueryable<Orders> OnQueryOrders(IQueryable<Orders> orderQuery)
{
return from o in orderQuery
where o.Customers.ContactName == HttpContext.Current.User.Identity.Name
select o;
}
或者我需要通过访问器沿着以下线路进行控制:
GetOrdersByCustomerstring customerId我认为,在这种情况下,更好的解决方案是构建一个真正的业务层,它位于应用程序层和LINQ to SQL类之间
然后,您将查询您的业务层,而业务层又将实现您的所有业务逻辑和过滤。如果架构设计得当,那么业务层对任何编码应用层的人都相当透明,那么每个人都会很高兴。就我个人而言,我发现像GetOrdersByCustomer这样的东西更容易理解和维护。拦截器在这里感觉不必要的复杂性。想想下一个需要维护你的代码的人,他可能没有你那么聪明。对于简单的场景来说,这很好,但我想允许更丰富的查询构建,这样很快就会有100个访问器,这反过来又会让维护或重构变得混乱/出错/噩梦。虽然拦截器可能会让人困惑,但它们确实允许关键的代码关注点一致地运行——但我认为Justin的想法更接近我们最终的结果Hi Justin是的,这看起来是我必须走的路线。我的方法看起来是这样的:将我的dataContext密封起来,但我的数据对象是公共的,即linq到sql中的表从BL中公开方法,这些方法可以接受谓词函数,然后这些谓词函数将被添加到带有业务安全逻辑的表达式树中。在我的原型中,这是可行的,虽然一开始有点混乱,但公开的内容非常清晰但灵活。根据应用程序的范围和性质,创建一个完整的BL可能不实用。LINQtoSQL能够自行处理业务规则验证。您可以使用分部类拦截数据操作,以实现与ADO.NET查询拦截器类似的目标。查看本文: