C# 属性 hell - 在两个不同 SQL 平台上的移动设备和服务器之间共享一个类

标签 c# xamarin custom-attributes ormlite-servicestack sqlite.net

我们与以下人员共享一个 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)保留为类的单一定义,并拥有许多以不同方式装饰的具体类。

有什么想法吗?

最佳答案

如果您要按照鲍勃叔叔的干净架构来构建代码,您就不会尝试将单个表示用于许多不同的目的,因为它会导致您的依赖项从高级策略向外指向外部圆圈。

Clean Architecture

来源: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/

相关文章:

c# - 将对象集合解压缩到其属性数组中

android - 非 Activity 中的 Xamarin ContentResolver/CursorLoader 访问

c# - 我可以为属性使用集合初始值设定项吗?

c# - Python 中的参数可以是逆变的还是协变的?

c# - 计算一周内工作的天数而不循环?

c# - ViewDataFactory 和强类型母版页

c# - 如何在 xamarin.mac 中绘制矩形

c# - 如何将文件从 windows 复制到单声道的 mac?

c# - 如何使用 Func<> 参数创建自定义属性

c# - 使用属性在事件上使用目标