我们与以下人员共享一个 poco
- ServiceStack Web 服务
- ServiceStack Orm 与 MySQL
- 使用 Sqlite.net 的 Xamarin 移动客户端。
问题是共享类变得一团糟。
[PrimaryKey, AutoIncrement]
public int Id { get; set; }
#if __MOBILE__
[Indexed]
#else
[Index]
#endif
public string UserAccountId { get; set; }
#if __MOBILE__
[Indexed]
#else
[Index]
#endif
如果情况还不够糟糕,我需要
- 限制数据库中每个字段的长度...
- 将这些对象保存在 MongoDb 中。幸运的是,他们有一个 AutoMapper 在运行时执行此操作的类。
不知道该怎么办。我失败的想法包括:
尝试使用:[Conditional("DEBUG")]。但它对此没有任何作用
sqlite.net 似乎使用了自己的属性
[AttributeUsage(AttributeTargets.Property)] 公共(public)类 IndexedAttribute :属性
所以它不会找到Mysql [Index]属性
可以尝试在每个属性上包含两个属性
[索引] [指数] 公共(public)字符串 UserAccountId { 获取;放; }
我试图将其变成两行,但 c# VS 提示
#if __MOBILE__ [Indexed] #endif #if __MOBILE__ [Index] #endif
最后,** APPEARS ** 唯一有效的方法就是将接口(interface)保留为类的单一定义,并拥有许多以不同方式装饰的具体类。
有什么想法吗?
最佳答案
如果您要按照鲍勃叔叔的干净架构来构建代码,您就不会尝试将单个表示用于许多不同的目的,因为它会导致您的依赖项从高级策略向外指向外部圆圈。
来源:https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html
实际上,您可以将实体与企业业务规则一起放置在中心圆中,但是用于存储/检索特定数据库数据的 DTO 应该远离您的“框架”和司机”圈子。
所有这些特定于数据库的属性都属于蓝色圆圈中的 DTO,而不是中心的实体。
关于C# 属性 hell - 在两个不同 SQL 平台上的移动设备和服务器之间共享一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47944407/