我是 Applicasa 的开发人员布道师。我们为移动应用程序开发人员构建了一套很酷的工具,其中一部分包括提供 BaaS 服务,与 Parse、StackMob 等相比,该服务采用了一些不同的方法。我认为它为解决从第三方 SDK API 中抽象出来的问题提供了一个有用的视角,这种方式允许您用其他提供商或您自己的提供商替换后端。/免责声明
外面有这样的东西吗?我已经搜索但没有成功,但也许我看错了方向
虽然有其他 BaaS 提供商提供类似和差异化的功能,但我不知道有一种产品以不可知的方式完全抽象出第三方提供商。
这样的最佳实践是什么?
我认为您已经为朝着正确的方向开始奠定了坚实的基础。
首先,您的预测是正确的,您最终会得到许多不同的类,这些类以与后端无关的方式封装对象和所需的功能。当然,数量取决于您所追求的抽象和封装类型。您概述的方法听起来也像我开始这样一个项目的方式 - 为我的应用程序需要与之交互的所有对象创建类,并在这些类(或它们都扩展的基类)上实现自定义方法这将完成与后端提供者交互的实际工作。
因此,如果我正在构建一个应用程序,例如,具有Foo
、Bar
和Baz
对象,我将创建这些类作为我的内部 API 的一部分,并具有我的应用程序所需的所有必要功能。所有应用程序逻辑和功能操作都只会与这些类交互,并且所有应用程序逻辑和功能都与数据后端无关(这意味着没有内部功能可以依赖于数据后端,但对象类将提供一致的接口,允许操作执行,同时保持数据处理方法私有)。
然后,我可能会让每个类都从一个类继承BaseObject
,其中包括实际与数据后端(基于提供程序或我自己的自定义远程后端)对话的方法。BaseObject
该类可能具有saveObject
, getById:
,之类的方法getObjects
(带有一些用于执行对象过滤/搜索的适当参数)。然后,当我将来想替换我的后端数据服务时,我只需要专注于更新BaseObject
处理数据交互的类方法,而我所有的应用程序逻辑和功能都与Foo
、Bar
和Baz
类相关联,并且不实际上并不关心获取/保存/更新/删除操作如何在幕后工作。
现在,为了让自己尽可能轻松,我将构建我的 BaaS 模式以匹配内部对象类名称(根据 BaaS 要求,我可以使用 anisKindOfClass:
或NSStringFromClass:
调用)。这意味着如果我使用 Parse,我想让我的save
方法获取NSStringFromClass:
类名的 ,以执行数据操作。如果我正在使用像 Applicasa 这样的服务,它会生成用于数据交互的本地对象的自定义 SDK,我希望基于isKindOfClass:
结果的自定义数据操作。如果我想要比这更大的灵活性(可能允许使用多个后端提供程序,或者其他一些复杂的要求),我会让所有子类BaseObject
通过某种自定义方法准确地告诉数据操作使用什么模式名称, 像getSchemaName
. 我可能会将其定义为BaseObject
默认情况下将类名作为字符串返回的方法,然后在子类上实现以进一步自定义。因此,BaseObject
save
方法的内部可能看起来像这样:
- (BOOL) save {
// call backend-specific method for saving an object
BaasProviderObject *objectToSave = [BaasProviderObject
objectWithClassName:[self getSchemaName]];
// Transfer all object properties to BaasProviderObject properties
// Implement however it makes the most sense for BaasProvider
// After you've set all calling object properties to BaasProviderObject
// key-value pairs or object properties, you call the BaasProvider's save
[objectToSave save];
// Return a BOOL value to indicate actual success/failure
return YES; // you'll want this to come from BaaS
}
然后在Foo
类中,我可能会getSchemaName
这样实现:
- (NSString) getSchemaName {
// Return a custom NSString for BaasProvider schema
return @"dbFoo";
}
我希望这是有道理的。
我应该坚持使用 Parse SDK 以确保使用它的代码得到很好的识别和包含吗?
进行这样的内部抽象将是大量的前期工作,但它不可避免地会提供很大的灵活性,可以按照您的意愿实现。你可以实现 CoreData,拒绝 CoreData,做任何你想做的事。以与数据无关的方式构建内部应用程序逻辑/功能具有明显的优势,即使它可以让您轻松地在应用程序代码的自定义分支中尝试另一个 BaaS,以了解您对另一个提供商的喜爱程度(或为您提供开发自己的数据解决方案的简单途径)。
我希望这会有所帮助。