您将如何命名/组织以下交互层次结构?如果应用程序完全是本地的并且没有网络部分,那么名称 Response 相关吗?是否可以在 ViewModel 中显示带有响应的类,或者仍然需要对其进行处理以消除响应?最佳实践是什么?
如果您对 User 感到困惑,那么您可以想出任何其他需要生成并批量添加到数据库中的随机类。
让我们有一个特定的用户类。
public class User
{
public int Age { get; set; }
}
接下来我们有一个生成用户列表的服务:
public class UserService
{
public IReadOnlyCollection<User> GetUsers()
{
}
}
根据此服务中的数据,我们将数据传输到下一个服务,该服务应将用户集合保存在数据库中。
public class UserProcessingService <-- сервис для работы с бд
{
public async Task SaveUsersAsync(IReadOnlyCollection<User> users)
{
//Сохраняем в бд
}
}
由于我们需要将User类保存在数据库中,因此我们至少需要向User类添加Id属性。但是如果我们直接将其添加到 User 中,那么为什么 UserService 应该知道有关数据库及其 id 的信息呢?这是数据层进入业务逻辑的流程。根据我的理解,该服务应该提供尽可能最压缩的类,而没有不必要的属性。所以我创建了一个新类。实体——数据库的实体。
public class UserEntity
{
public int Id { get; set; }
public int Age { get; set; }
}
User 和 UserEntity 具有通用代码,我创建一个接口来同步它们的属性。这两个类现在都实现了这个接口。
public interface IUser
{
public int Age { get; set; }
}
现在,在 SaveUsersAsync 方法中,我们将 User 集合传输到 UserEntity 集合并保存它。接下来我想从 UserProcessingService 获取用户集合。让我们创建返回的类:
public class UserResponse : IUser
{
public int Id { get; set; }
public int Age { get; set; }
}
并更新我们的ProcessingService
public class UserProcessingService
{
public async Task SaveUsersAsync(IReadOnlyCollection<User> users)
{
//Сохраняем в бд
}
//Новый метод
public async Task<IReadOnlyCollection<UserResponse>> GetUsersAsync()
{
//Получаем коллекцию пользователей из бд, маппим и отдаем
}
}
我通常避免
Service在类名中使用任何内容,因为它是垃圾并且没有任何意义,UserService它就像UserClass. 只清楚有关于用户的东西,但具体是什么就不清楚了。如果一个类执行 CRUD,那么它就是
Manager. 如果一个类产生或生成数据(例如工厂),那么它就是Provider。例如,Manager他可以去医院Provider与外界保持联系。数据模型应简单命名为
User,Role,PermissionSet。不同的命名空间中可以有相同名称的类,但您需要非常小心,避免实体冲突或混淆。这是通过命名空间和修饰符的层次结构来实现的internal,以便实体不会出现在不需要的地方。如果主应用程序/服务器代码不应该直接操作实体,那么应该故意隔离(封装)它们。一般来说,最好不要太花哨的命名,也不要发明专有技术,否则代码将变得对其他开发人员来说难以理解(其他开发人员甚至可以在N时间后指自己,当你紧张并记住时) “当我写这篇文章时,我在吸什么?”)。尝试让代码易于理解是能够编写可维护代码的一个重要部分。越简单越好。
如果你严格遵循SOLID,尤其是SRP,那么类名应该不会有问题。