0

上操纵域对象专有的生物信息学软件的工作,我必须加强API,使外部各方可以访问存储在内部DB(CRUD)数据。建议数据库查询API

的数据由类型(如分子,寡核苷酸和酶)分组并在每个中,可以有子集(分子::蛋白质,分子:: DNA等),其可以嵌套的。

由于每个数据类型具有不同的属性,我们使用格式化查询字符串(类似于广泛使用的entrez格式)来指定搜索条件。代码的例子进行如下:

IMoleculePersistenceService svc = PersistenceFactory::GetMoleculeService(); 

// IMoleculePersistenceService::search(<search-string>, <subset>); 
IMolecule[] searchResult = svc.search("Foo[Name] OR 128[Length]", "molecule::protein"); 


我的问题是:

假设用户有相应的领域知识,了解生物学相关的层次结构。 搜索功能接受prototype对象而不是格式化字符串会更好吗?

IMoleculePersistenceService svc = PersistenceFactory::GetMoleculeService(); 

IMoleculeTemplate searchPrototype = svc.GetSearchPrototype(); 
searchPrototype.SetName("Foo"); 
searchPrototype.SetLength(128); 

IMolecule[] searchResult = svc.search(searchPrototype, "molecule::protein"); 
IMolecule[] searchResult2 = svc.search(svc.GetSearchPrototype(<parameters>), "molecule::protein"); 


优点:
-easier可视化/明白
兼容与查询字符串如果prototype可以自动序列化为(格式化)的字符串。
缺点:
- 由于标准组合是固定的(AND,OR),所以不灵活。

回答

0

服务应该只接受一个“原型”。将字符串解析为原型是它自己的一项功能,并不直接属于该服务。我会推广基于原型的产品。首先在HowTo中展示它的例子,并在稍后提及解析能力。

在C#的土地上,有IQueryable界面 - 看看answers to this question。原型非常类似于Expression s,但这可能对于手头的需求而言过于通用。

此外,返回一个数组可能不是最好的选择,因为这解决了实施使用数组。同样在C#中,有IEnumerable,但我希望看到一些简单的SearchResult类提供生成的能力/返回结果数组,因此,让您的内部变化和优化。