C# 存储库模式实现建议
我在现有系统上实现存储库模式,主要是为了能够独立地对业务逻辑层进行单元测试。但我担心我有一个层次太多,建议将不胜感激。没有ORM,使用SQL Server作为数据库 我有以下资料:C# 存储库模式实现建议,c#,repository,C#,Repository,我在现有系统上实现存储库模式,主要是为了能够独立地对业务逻辑层进行单元测试。但我担心我有一个层次太多,建议将不胜感激。没有ORM,使用SQL Server作为数据库 我有以下资料: 数据映射层-将对象链接到数据库表 存储库接口 存储库的具体实现 业务逻辑层 表示层 我发现我经常在存储库具体实现中创建一个方法,该方法返回一个简单的数据段(例如一个到期日期-日期时间变量),然后组合一个运行存储库具体实现方法的业务逻辑层方法,并将其返回到表示层 如果BLL没有添加任何附加逻辑,演示文稿是否有理由在以后
谢谢。使用存储库模式并不取决于您是否使用ORM,您只需在存储库库中使用经典的Ado.net即可。但关于应用程序的分层,我建议你们看一看博客文章 如果BLL没有添加任何附加逻辑,演示文稿是否可以在以后直接调用具体的实现方法? 当然,如果您没有任何BLL或服务层imp,您可以稍后在演示文稿中直接调用存储库
请参阅文章以正确实现存储库听起来您误解了存储库模式的目的。我们的想法是创建一个类,它允许您集中管理特定模型的所有存储/检索-使用它返回简单类型,如
DateTime
,这似乎是错误的方法
您的存储库应该纯粹处理对象,因此您可以使用如下方法
SomeClass GetSomeClass(...);
void AddSomeClass(...);
不是
分层体系结构的要点是确保不耦合应用程序的各个部分
- DAL不应该知道BLL/PL
- BLL应该知道DAL,但应该通过您的存储库进行控制
- PL应了解BL,但应通过服务进行控制(通常)
例如,如果您的BLL通过
IRepository
接口与DAL通信,则BLL只能在该接口的范围内工作,它不知道DAL使用的是哪种存储机制-这称为持久性忽略。因此,如果将来您将DAL从MS SQL后端交换到MySQL后端,这将不会对您的BLL产生影响,因为层之间的契约(即IRepository
接口)没有改变。两个好链接,很高兴看到同样的问题得到了考虑。您的观点非常好,存储库应该只处理对象。我对确保it负责所有数据访问感到有些激动。在我的示例中,ExpiryDate实际上是另一个对象的属性。@而且,刚才这种控制级别似乎还可以,但实际上它永远不会缩放。想象一下,如果您有一个具有20-30个属性的复杂对象,那么最终每个属性都会有一个存储库方法。
DateTime GetExpiryDate(...);
string GetName(...);