核心数据编码模式

时间:2018-08-14 20:26:53

标签: swift core-data swift3

我一直在使用带有Entity Framework(EF)的存储库设计模式的C#,该模式允许我使用每个表的通用类与数据库进行交互。

enter image description here

此存储库具有我需要的所有功能,例如:向数据库中添加新实体,更新现有实体,删除实体,保存上下文等...

例如,我在数据库中有一个名为“ Person”的实体。我将创建一个名为PersonRepository的新类,该类具有更改/向数据库添加值所需的所有功能。

因此,要与数据库交互,您将创建存储库类的实例。然后,这使您可以调用此类的函数,该类又与数据库进行交互。这种模式的想法是,您对实体的所有数据库调用都被隔离到一个类中,从而提高了可测试性和关注点分离。

我正在学习如何在Swift程序中使用Core Data,它似乎与C#中的EF相似。我已经在.xcdatamodel文件中创建了实体,并通过“编辑器”>“创建NSManageedObject子类”选项创建了关联的Cocoa Touch类。

我使用了“ Category / Extension”(代码类别/扩展)CodeGen选项,因此,我创建了一个名为“ Exercise”的新类。根据我的阅读,此类可以包含其他逻辑,例如,重写prepareForDeletion方法。这是否意味着我可以将addEntity,updateEntity函数添加到此方法上,然后从其他代码文件中调用它们?

我的问题是:

  1. 我可以实现与C#中可以使用的相同的存储库模式吗? 我相信这将在我实体的生成类上(见下图)

  2. 我所有的数据库调用函数都放在哪里?如果可以使用此存储库模式,则将其放置在此处,但是,如果不能使用,是否可以将它们放置在单独的代码文件中?我是否应该将它们放在生成的实体文件中,该文件是为添加其他逻辑而创建的?

enter image description here

  1. 如果我可以使用存储库模式,是否有办法将上下文注入到此类中,或者,每次要更改它时都必须调用getContext方法吗?在C#中,每次我想对数据库进行更改时,我们都可以使用服务将上下​​文注入到类中-我不确定在Swift中是否可以做到这一点。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,那么在Swift中,相当于您的“存储库”类可能是两件事之一。这可能是核心数据的上下文,您可以运行查询并将其保存到OR(更有可能),您将创建一个新类或结构,以从业务端遮盖核心数据。假设稍后,您的“ dataManager”类将执行与核心数据的所有交互。然后,它可以将NSmanagedobjects返回到业务端,或者您可以映射/转换/转换为其他类型。

是的,Exercise是一个对象,它是nsmanagedobject的子类,因此它具有托管对象的所有核心数据功能,但是您可以添加所需的任何自定义函数。

您的数据管理器类将执行查询并返回正确的对象。例如data manger.getExercises()-> [Exercises],dataManager.save(_exercise:Exercise)等...

您需要在模式中考虑线程安全性。一种选择是将nsmanagedobjects转换为datamanager中的struct,而不返回nsmangedobjects。结构是线程安全的,并且使用可编码的代码可以轻松地在exerciseManagedOjbect和exerciseStruct之间进行转换。另外,通过此dataManager类示例,您可以在将来删除核心数据以使用另一个持久性选项,从而减少对应用程序整体的影响。