使用POCO作为请求和响应DTO是否可行(良好实践)?我们的POCO很轻量级(ORM Lite),只有属性和一些装饰属性。
或者,我应该为请求和/或响应创建其他对象吗?
谢谢。
使用POCO作为请求和响应DTO是否可行(良好实践)?我们的POCO很轻量级(ORM Lite),只有属性和一些装饰属性。
或者,我应该为请求和/或响应创建其他对象吗?
谢谢。
public class User
{
[PrimaryKey, AutoIncrement, Alias("Id")]
public int UserId { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public string Salt { get; set; }
public bool Enabled { get; set; }
}
Username
和Password
填入您的User
POCO中并发送至服务器。Password
字段中的密码将是明文。我们是优秀的程序员,安全性很重要,因此我们需要创建一个盐,将其添加到Salt
属性中,并使用盐散列Password
并更新Password
字段。好的,这不是一个大问题,在插入之前几行代码就可以解决。
客户端可能已经设置了UserId
,但对于创建操作,这不是必需的,会导致数据库查询失败。因此,在插入数据库之前,我们必须将此值设置为默认值。
请求中可能传递了Enabled
属性。如果有人设置了这个属性,那怎么办?我们只想处理Username
和Password
,但现在我们必须考虑其他会影响数据库插入的字段。同样,他们可能会设置Salt
(尽管这不是问题,因为我们无论如何都会覆盖该值。)因此,现在你需要添加验证。
但是现在考虑当我们返回一个List<User>
时。
return Db.Select<User>();
Password
哈希和Salt
,以防止它被序列化输出到响应中。public class User
{
// Properties as before
...
[Ignore] // This isn't a database field
public bool SendWelcomeEmail { get; set; }
}
User
POCO,您会发现随着时间的推移,您正在添加越来越多不适用于某些上下文的属性。SendWelcomeEmail
属性,但这毫无意义。这样就很难维护代码了。public class CreateUserRequest
{
public string Username { get; set; }
public string Password { get; set; }
public bool SendWelcomeEmail { get; set; }
}
public class UserResponse
{
public int UserId { get; set; }
public string Username { get; set; }
public bool Enabled { get; set; }
}
public class User
{
[PrimaryKey, AutoIncrement, Alias("Id")]
public int UserId { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public string Salt { get; set; }
public bool Enabled { get; set; }
}
CreateUserRequest
)时,我们不必考虑UserId
、Salt
或Enabled
。List<UserResponse>
,客户端不会看到我们不想让他们看到的任何属性。希望这能帮到您。
Person { ... }
Address { ... }
ResponceDTO
{
public bool success {get; set;}
public string message {get; set;}
public Person person {get; set;}
public List<Address> addresses {get; set;}
//customer can use the Person & Address, which can be the same or different
//with the ones in the data-layer. But we have defined these POCO's in the specs.
}
RequestDTO
{
public int Id {get; set;}
public FilteByAge {get; set;}
public FilteByZipCode {get; set;}
}
UpdatePersonRequest
{
public int Id {get; set;}
public bool IsNew {get; set;}
public Person person {get; set;}
public List<Address> addresses {get; set;}
}
我们不仅向外界暴露 Request 或 Response DTOs。
Person 和 Address 是与客户协商的,并在 API 规范中引用它们。
它们可以与数据层内部实现相同、部分相同或者不同。
客户将在他们的应用程序、网站或移动设备中使用它们。
但重要的是,我们首先设计和协商 API 接口。
我们通常将 requestDTO 作为参数传递给业务层函数,
该函数返回响应对象或集合。
这样,服务代码就成为了业务层前面的一个薄包装器。
ResponseDTO Get(RequestDTO request)
{
return GetPersonData(request);
}