使用ServiceStack自动查询时如何管理关注点分离

时间:2019-08-14 04:43:12

标签: servicestack servicestack-autoquery

我在组织自动查询代码方面遇到一些问题。我的项目结构目前看起来像:

/Project
/Project.ServiceInterface
  Service.cs
/Project.Logic
  Manager.cs
  /Types
    DbModel.cs
/Project.ServiceModel
  Request.cs
  /Types
    DtoModel.cs

使用此设置,ServiceModel不了解逻辑模型。因此,如果不能在本质上复制我的ServiceModel中的所有DbModel对象或向ServiceModel中的Logic添加依赖项,就无法进行类似QueryDb<DbModel, DtoModel>的请求查询。我还具有自定义的AutoQuery服务实现,在这些实现中,我希望能够利用在其他地方使用DbModels编写的代码。

有人有任何建议或相关示例吗?我觉得我在错误地解决了这个问题,并使它变得比需要的更为复杂。谢谢。

1 个答案:

答案 0 :(得分:1)

Auto Query使您可以通过定义请求DTO 来创建服务,因为它引用的所有类型也必须是 ServiceModel 程序集,因此您要么需要将您的自动查询服务引用的数据模型移动到您的 ServiceModel 项目或注释DTO,以便OrmLite可以使用它来查询RDBMS表,在其中可以使用[Alias]属性,其中名称不同,[Ignore*]属性取决于OrmLite还是序列化中应存在的属性,例如:

[Alias("MyTable")]
public class MyDto
{
    [Alias("DbName")]
    public string DtoName { get; set; }

    [Ignore] 
    public string IgnoredInOrmLite { get; set; }

    [IgnoreDataMember] 
    public string IgnoredInSerialization { get; set; }
}

否则,您将无法使用自动查询,并且需要创建自定义服务,其内部实现会利用您的数据模型(隐藏在公共服务合同中的数据模型)。​​

我个人建议将您需要的数据模型移至您的 ServiceModel 程序集(该程序集继续使用与其他DataModels相同的命名空间),就像OrmLite DataModels are POCOs除了无隐式的 ServiceStack.Interfaces 之外,不需要任何其他引用。