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



我在如何组织自动查询代码方面遇到了一些问题。我的项目结构目前如下所示:

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

通过此设置,服务模型不了解逻辑模型。因此,我无法像QueryDb<DbModel, DtoModel>那样进行请求查询,而无需基本上复制我的服务模型中的所有 DbModel 对象或向 ServiceModel 中的逻辑添加依赖项。我也有自定义的自动查询服务实现,在这些实现中,我希望能够利用在其他地方使用我的 DbModel 编写的代码。

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

自动查询允许您通过定义请求 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程序集(继续使用与其他DataModel相同的命名空间(,因为OrmLite DataModels是POCO,与DTO一样,除了无impl的ServiceStack.Interfaces之外,通常不需要任何其他引用。

最新更新