到目前为止,我一直在所有c#数据库驱动的应用程序中使用Active记录。但是现在我的应用程序需要将我的持久性代码从业务对象中分离出来。我已经阅读了很多关于Martin Fowler的数据映射模式的帖子,但我对这种模式的了解仍然非常有限。
让我们使用以下示例:
如果我有2个表 - Customer和CustomerParameters。 CustomerParameters表包含用于创建新Customer的默认Customer值。
然后我将创建一个CustomersMapper类来处理所有的Customer持久性。然后,我的Customer和CustomersList类将与此映射器类协作,以便持久保存客户数据。
我有以下问题:
如何将原始数据传输到&从我的Customer类到映射器而不破坏某些业务规则? DTO的?
在我的Mapper类中使用SaveAll和LoadAll方法来更新和加载多个客户的数据是否可以接受?如果是这样,在SaveAll的情况下,映射器将如何知道何时更新或插入数据?
客户映射器类是否也负责从CustomerParameters表中检索默认值,或者创建CustomerParameters映射器会更好吗?
O / R映射器工具实际上并不在这里。我正在使用的数据库是Transactional,需要我编写自己的Mapper模式。
非常感谢任何想法和评论。
答案 0 :(得分:11)
肖恩我会这样回答你的问题:
ad 1)Mapper负责创建Customer对象。您的Mapper对象将具有类似RetrieveById方法(例如)。它将接受一个ID,并以某种方式(他不负责Mapper对象)构造有效的Customer对象。另一种方式也是如此。当您使用有效的Customer对象调用Mapper.Update方法时,Mapper对象负责确保所有相关数据都是持久的(在适当的地方 - 数据库,内存,文件等)
ad 2)正如我在上面提到的,检索/持久化是Mapper对象上的方法。它有责任提供这样的功能。因此,LoadAll,SaveAll(可能传递一个值对象数组)是有效的Mapper方法。
ad 3)我会说是的。但是您可以将Mapper对象的各个方面分成不同的类(如果您需要/需要):默认值,规则验证等。
我希望它有所帮助。我真的建议/建议你阅读Martin Fowler的书Patterns of Enterprise Application Architecture。
答案 1 :(得分:0)
我建议您在尝试自己实现Data Mapper模式之前先看看O / R映射器工具。它会为你节省很多时间。 O / R-mapper的流行选择是NHibernate。
答案 2 :(得分:0)
你可以查看iBATIS.NET作为NHibernate的替代品。它也是一个O / R工具,但我发现它比NHibernate更容易使用。