存储库模式实现建议

时间:2014-02-20 10:11:13

标签: c# repository

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

我有以下内容:

  1. DataMapping Layer - 将对象链接到数据库表
  2. 存储库接口
  3. 存储库具体实施
  4. 业务逻辑层
  5. 表示层
  6. 我发现我经常在Repository Concrete Implementation中创建一个方法,它返回一个简单的数据(例如Expiry Date - DateTime变量),然后将运行Repository Concrete的业务逻辑层方法放在一起实现方法并将其返回到表示层。

    如果BLL没有添加任何其他逻辑,是否有一种情况可以直接调用Concrete Implementation方法?如果单元测试还有其他逻辑,那么只能使用BLL方法吗?

    我正在使用依赖注入来管理Concrete Impementation。

    感谢。

2 个答案:

答案 0 :(得分:1)

听起来像是你误解了Repository模式的目的。我们的想法是创建一个类,允许您集中管理特定模型的所有存储/检索 - 使用它来返回像DateTime这样的简单类型似乎是错误的方法。

您的存储库应该完全处理对象,因此您将拥有类似

的方法
SomeClass GetSomeClass(...);
void AddSomeClass(...);

DateTime GetExpiryDate(...);
string GetName(...);

分层架构的目的是确保您不会将应用程序的各个部分耦合

  • DAL不应该知道BLL / PL
  • BLL应该了解DAL,但应通过您的存储库控制
  • PL应该知道BL,但应该通过服务(通常)来控制

在层之间进行通信时,通常认为使用 interfaces 而不是具体类是个好主意。一个接口定义了一个契约,然后你可以为你的各个层建模 - 这个想法是你隐藏了实现,因此如果你将来完全改变它,其他层就不会知道。

例如,如果您的BLL通过IRepository接口与DAL通信,则BLL只能在该接口的范围内工作,它不知道DAL使用的是什么类型的存储机制 - 这是称为持久性无知。因此,如果将来你将DAL从MS SQL后端换成MySQL后端,这对你的BLL没有影响,因为层之间的契约(即IRepository接口)没有改变。

答案 1 :(得分:0)

使用存储库模式不依赖于您是否使用ORM,您只需在存储库库中使用经典的Ado.net。但关于分层你的应用程序我建议你看看this博客文章

如果BLL没有添加任何其他逻辑,那么Presentation Later是否会直接调用Concrete Implementation方法? 确定如果您没有任何BLL或服务层imp,您可以稍后直接在演示文稿中调用存储库。

参考this文章正确实施存储库