C# 存储库模式实现建议

C# 存储库模式实现建议,c#,repository,C#,Repository,我在现有系统上实现存储库模式,主要是为了能够独立地对业务逻辑层进行单元测试。但我担心我有一个层次太多,建议将不胜感激。没有ORM,使用SQL Server作为数据库 我有以下资料: 数据映射层-将对象链接到数据库表 存储库接口 存储库的具体实现 业务逻辑层 表示层 我发现我经常在存储库具体实现中创建一个方法,该方法返回一个简单的数据段(例如一个到期日期-日期时间变量),然后组合一个运行存储库具体实现方法的业务逻辑层方法,并将其返回到表示层 如果BLL没有添加任何附加逻辑,演示文稿是否有理由在以后

我在现有系统上实现存储库模式,主要是为了能够独立地对业务逻辑层进行单元测试。但我担心我有一个层次太多,建议将不胜感激。没有ORM,使用SQL Server作为数据库

我有以下资料:

  • 数据映射层-将对象链接到数据库表
  • 存储库接口
  • 存储库的具体实现
  • 业务逻辑层
  • 表示层
  • 我发现我经常在存储库具体实现中创建一个方法,该方法返回一个简单的数据段(例如一个到期日期-日期时间变量),然后组合一个运行存储库具体实现方法的业务逻辑层方法,并将其返回到表示层

    如果BLL没有添加任何附加逻辑,演示文稿是否有理由在以后直接调用具体的实现方法?如果单元测试有额外的逻辑,那么只使用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(...);