jos*_*ers 7 .net c# database design-patterns
我的情况是我搞砸了.大约1.5年前,当我采用这个位置而不是重新发明轮子时,我继承了我的代码库,尽管我现在知道我应该拥有,但我保持DAL与之前的开发人员几乎完全相同.
基本上有一个文件(现在是15k行代码),用作一堆使用DataSet和TableAdapter来检索数据的DAO.我的xsd文件已经发展到这样的大小,每次打开时它们都会导致R#崩溃视觉工作室,而现在15k行的中间类也需要永远让R#进行分析.更不用说它是丑陋的,它可以工作,但不是很好,并且是调试的绝对噩梦.
到目前为止我尝试过的是切换到NHibernate.NHibernate是一个很棒的库,但不幸的是它不适应我的应用程序,从主要的开发人员说(Fabio Maulo)它几乎是我的应用程序要求和NHibernate在使用身份作为数据库时的限制的组合PK战略.
所以现在我回到基本上设计我自己的DAL.我正在考虑一些不同的模式,但是想获得你的DAL设计策略.有很多方法和理由以特定的方式实施DAL,所以如果你能解释你的策略以及为什么它最适合你,我将非常感激.
提前致谢!
编辑:让我解释为什么NHibernate没有工作,因为这似乎是立即响应.我的用户创建了一个"作业",它实际上只是我的Job类的瞬态表示.在这项工作中,他们将给出一个或一个在创建时也是短暂的权重因子列表.最后,他们提供了一个工作细节列表,这些细节具有与之相关的特定权重因子.因为,在DB中,当我继续工作时权重因子是唯一的,并且当它找到重复的权重因子时,它会降低到权重因子.我尝试在将权重因子分配给详细信息之前运行检查(我不想这样做,因为我不想对数据库进行额外调用)但在NH中调用CreateCriteria也会导致会话中的刷新,根据Fabio,它会破坏我的缓存,从而杀死整个作业的内存表示.NH邮件列表上的人说我应该切换到GUID,但这不是一个可行的选择,因为转换过程将是一场噩梦.
我对 NHibernate 的体验是,虽然它功能丰富且性能非常高,但您最终需要成为 NHibernate 专家才能修复一些意外行为。通读支持 NHibernate 的答案并了解
嗯,也许他使用长时间运行的会话(每个业务事务模型的会话),并且在这种方法中,不鼓励使用身份,因为它会破坏您的工作单元(它需要在插入新实体后直接刷新)。解决方案可能是放弃身份,并使用 HiLo 身份生成器。
准确地说明了我的意思。
我所做的是创建一个稍微模仿 ActiveRecord 模式的基类,我继承该基类并使用属性标记继承的类,这些属性将其附加到每个用于选择、插入、更新和删除的存储过程。基类使用Reflection 读取属性并将类的属性值分配给SP 参数,并且在Select() 的情况下,将结果SQLDataReader 的列值分配给泛型列表的属性。
这是 DataObjectBase 的样子:
interface IDataObjectBase<T>
{
void Delete();
void Insert();
System.Collections.Generic.List<T> Select();
void Update();
}
Run Code Online (Sandbox Code Playgroud)
这是从中派生的数据类的示例:
[StoredProcedure("usp_refund_CustRefundDetailInsert", OperationType.Insert)]
[StoredProcedure("usp_refund_CustRefundDetailSelect", OperationType.Select)]
[StoredProcedure("usp_refund_CustRefundDetailUpdate", OperationType.Update)]
public class RefundDetail : DataObjectBase<RefundDetail>
{
[StoredProcedureParameter(null, OperationType.Update, ParameterDirection.Input)]
[StoredProcedureParameter(null, OperationType.Insert, ParameterDirection.Output)]
[StoredProcedureParameter(null, OperationType.Select, ParameterDirection.Input)]
[ResultColumn(null)]
public int? RefundDetailId
{ get; set; }
[StoredProcedureParameter(null, OperationType.Update, ParameterDirection.Input)]
[StoredProcedureParameter(null, OperationType.Insert, ParameterDirection.Input)]
[StoredProcedureParameter(null, OperationType.Select, ParameterDirection.Input)]
[ResultColumn(null)]
public int? RefundId
{ get; set; }
[StoredProcedureParameter(null, OperationType.Update, ParameterDirection.Input)]
[StoredProcedureParameter(null, OperationType.Insert, ParameterDirection.Input)]
[ResultColumn(null)]
public int RefundTypeId
{ get; set; }
[StoredProcedureParameter(null, OperationType.Update, ParameterDirection.Input)]
[StoredProcedureParameter(null, OperationType.Insert, ParameterDirection.Input)]
[ResultColumn(null)]
public decimal? RefundAmount
{ get; set; }
[StoredProcedureParameter(null, OperationType.Update, ParameterDirection.Input)]
[StoredProcedureParameter(null, OperationType.Insert, ParameterDirection.Input)]
[ResultColumn(null)]
public string ARTranId
{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我知道这似乎是我在重新发明轮子,但我发现的所有库要么过于依赖其他库(例如,ActiveRecord + NHibernate,紧随其后),要么使用和管理过于复杂。
我制作的库非常轻量级(可能只有几百行 C#),除了为参数赋值和执行 SP 之外什么也不做。它也非常适合代码生成,因此最终我希望不编写数据访问代码。我还喜欢它使用类实例而不是静态类,这样我就可以将数据传递给查询,而无需一些尴尬的条件集合或 HQL。Select() 的意思是“变得更像我”。
| 归档时间: |
|
| 查看次数: |
1023 次 |
| 最近记录: |