数据映射器,存储库和工作单元模式

时间:2016-11-23 19:10:37

标签: design-patterns repository-pattern datamapper unit-of-work

我正在学习以下模式

  • 数据映射器
  • 存储库
  • 工作单元

我想我理解他们每个人但我无法回答这些问题

  • 他们总是习惯在一起吗?
  • 哪种模式使用其他模式?
  • 域模型知道哪种模式?
  • 他们每个人处理什么CRUD操作?
  • 谁拥有数据库代码(即SQL)?

感谢。

1 个答案:

答案 0 :(得分:0)

Data Mapper会将您的数据库对象映射到应用程序中使用的真实世界对象,并以相反的方式(从实际工作对象到数据库对象)。您可以使用此功能,因为您可能在数据库中拥有不希望在应用外显示的属性。示例可以是数据库中的createdDate,timestamp或加密值。所以你的模型可能看起来像

UserDatabaseModel (This is whats in your database)
    Id
    Name
    Email (stored encrypted in the database)
    CreatedDate
    Timestamp

UserViewModel (This is what you want to show your user)
    Id
    Name (shown not encrypted)
    Email

您的映射器负责将UserDatabaseModel maping到UserViewModel并且不加密电子邮件(向用户显示加密的电子邮件地址毫无意义)。另一种方法是将UserViewModel映射到UserDatabaseModel并加密要存储在数据库中的电子邮件。 Mapper将在幕后处理这个问题,所以你不必担心一直在调用加密/解密。

工作单元和存储库一起工作。工作单元控制工作单元,因此,如果更新用户实际更新数据库中的2个表,则只需保存两个表保存的详细信息。你将它包装在你的工作单元中(就像在sql中的事务一样)。您的存储库负责CRUD或任何其他数据库操作。您将定义从数据库获取用户或更新存储库中用户的代码。

因此,从代码更新数据库可能类似于:

try{
    uow = new UnitOfWork //start a new database transaction

    repo = new UserRepository
    repo.UpdateUser //calls database
    repo.UpdateUserAddress //calls database

    uow.Save //commit the database transaction
} catch {
    uow.Rollback //something went wrong, rollback transaction
}