c# -无Sql数据库与动态对象通知
本文关键字:动态 对象 通知 数据库 Sql | 更新日期: 2023-09-27 18:12:48
我正在考虑使用NO SQL数据库,如MongoDb, RavenDb或任何其他建议我会考虑。
关于我下面的问题,有人能给我一些建议、教程和有用的链接吗?
我想写的这个系统必须是动态的,例如模型可能会改变分配,不应该在c#中硬编码。
例如,如果我有一个JSON文档保存ID, NAME, FULL NAME,然后添加一个名为PHONENUMBER的属性,我不想重建c#代码或重新部署。
是否可以从动态JSON中构建c#模型?然后能够操纵它吗?
如果是的话,对于这种类型的系统最推荐什么库?哪些库最适合。net ?
这个问题是我开始大学项目的一个步骤。
感谢帮助&建议。
是的,使用RavenDB可以很容易地做到这一点。有两种方法。你可以使用一个完全动态的模型,利用c# dynamic
关键字。这可以让你做任何你想做的事情,包括在运行时添加属性,查询运行时属性等。
然而,更常见的设置是,您将使用许多常见属性(例如,客户必须有一个名称)。所以你会得到一个像这样的模型:
public class Customer
{
public string Id {get;set;}
public string Name {get;set;}
public dynamic Props {get;set;}
}
固定属性是用c#编码的,这有助于您进入一个更容易,更一致的模型,并使用所有常用的编译工具。动态内容在Props属性中(通常初始化为ExpandoObject
)。
注意,你不能使用dynamic
执行linq查询。这是c#的限制,而不是RavenDB。您仍然可以使用RavenDB进行动态查询,但是您必须使用基于字符串的查询API。
我实现了Json。. NET序列化器包装器可以帮助您:
https://github.com/welegan/RedisSessionProvider/blob/master/RedisSessionProvider/Serialization/RedisJSONSerializer.cs我在我的库中使用它来存储ASP的内容。. NET的Session对象在Redis内部,这是一个NoSQL选项,你没有提到。尽管如此,考虑到Json的无类型特性,我认为无论您选择哪种NoSQL数据库,它都将适用于您的需求。基本步骤如下:
序列化:
决定一个分隔符(我可能会选择一个更好的)
存储类型信息(您可以缓存它以提高性能)
将对象数据存储在分隔符
之后
反序列化:
查找类型info直到分隔符
反序列化
Type
对象将
Type
以及对象数据传递到您选择的库。至少是Json。. NET和ServiceStack。
编辑
我似乎误解了你问题的一部分。您希望能够在不重新部署c#的情况下支持添加json属性,我的示例将在返回noSql数据库的序列化步骤中剥离额外的属性。您可以使用Dictionary<string, string>
或ExpandoObject
,就像ayende或mxmissile建议的那样,但请记住,这样您将无法保证获得的对象的属性类型。换句话说,您可以自由地添加属性名称,但是一旦您将属性的类型从int
更改为long
,您的代码就会意外中断。根据您的用例,这可能重要,也可能不重要,只是要记住一些东西。
是的,使用字典。但是,我不确定这些数据库系统是如何处理字典的。优雅与否
不,c#已经编译好了,所以一旦编译好了,如果不修改源代码并再次编译,就不能修改它。我认为你应该添加一些Javascript,因为这是JS的强项。