首页 / C# / 在规范中组合C#代码和数据库代码
在规范中组合C#代码和数据库代码
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在规范中组合C#代码和数据库代码,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1576字,纯文字阅读大概需要3分钟。
内容图文
![在规范中组合C#代码和数据库代码](/upload/InfoBanner/zyjiaocheng/906/594ce4bb202e4cf0a2179a8935202185.jpg)
有时您需要定义一些业务规则,而规范模式是一个有用的工具.例如:
public class CanBorrowBooksSpec : ISpecification<Customer>
{
public bool Satisfies(Customer customer)
{
return customer.HasLibraryCard
&& !customer.UnpaidFines.Any();
}
}
但是,我经常发现我需要将这些规则“推送”到SQL中以提高性能或满足分页记录列表等内容.
然后我不得不为规则编写代码两次,一次是在CLR代码中,一次是在SQL(或ORM语言)中.
你如何组织这样的代码?
如果代码在同一个类中保存在一起似乎是最好的.这样,如果开发人员更新业务规则,他们忘记更新两组代码的可能性就会降低.例如:
public class CanBorrowBooksSpec : ISpecification<Customer>
{
public bool Satisfies(Customer customer)
{
return customer.HasLibraryCard
&& !customer.UnpaidFines.Any();
}
public void AddSql(StringBuilder sql)
{
sql.Append(@"customer.HasLibraryCard
AND NOT EXISTS (SELECT Id FROM CustomerUnpaidFines WHERE CustomerId = customer.Id)");
}
}
然而,这对我来说似乎非常难看,因为我们现在正在将问题混合在一起.
另一种选择是使用Linq-To-YourORM解决方案,因为LINQ代码可以针对集合运行,也可以转换为SQL.但我发现除了最微不足道的场景之外,这些解决方案几乎不可能实现.
你是做什么?
解决方法:
我们使用了实体框架的规范模式.以下是我们如何处理它
public interface ISpecification<TEntity>
{
Expression<Func<TEntity, bool>> Predicate { get; }
}
public class CanBorrowBooksSpec : ISpecification<Customer>
{
Expression<Func<Customer, bool>> Predicate
{
get{ return customer => customer.HasLibraryCard
&& !customer.UnpaidFines.Any()}
}
}
然后你可以使用它来对抗LINQ到实体
db.Customers.Where(canBorrowBooksSpec.Predicate);
在LINQ-to-Objects之类的
customerCollection.Where(canBorrowBooksSpec.Predicate.Compile());
内容总结
以上是互联网集市为您收集整理的在规范中组合C#代码和数据库代码全部内容,希望文章能够帮你解决在规范中组合C#代码和数据库代码所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。