使用 EF6、域、DTO、ViewModel 的多层应用程序中对象的命名约定

Naming convention for objects in multi-layer application with EF6, domain, DTO, ViewModel

我正在开始一个具有多层和多种客户端类型(WebApp、WebAPI、Xamarin 和 Windows)的新项目。我想试试 "Clean Architecture".

我以前的应用程序没有应用层,我的视图模型直接与Entity Framework DbContext耦合。我在 ASP.NET 和网络开发方面的经验也很少。

是的,这是一个类似于这些的问题:

File naming convention for layers

但我不是在问如何组织我的架构,更多的是关于在一个文件中使用来自不同层的具有相同 class 名称的对象,或者最终改变我的约定以在域中使用 UserBO 命名例如图层。

问题

所以,在 Persistence 层中,我有一个名为 "User" 的 POCO class。

namespace Persistence.Entities
{
    public class User
    {
        // (...)
    }
}

在域层我也有 class 称为 "User"。

namespace Domain.Entities
{
    public class User
    {
        // (...)
    }
}

在 Windows 和 Android 客户端中,我将创建 ViewModel,但我可以将其命名为 "UserVM",这不是问题。在WebAPI中会有"UserDTO",所以也没有问题。但是在应用层我想创建一些使用两个同名的classes的方法:

using System.Collections.Generic;

namespace Application
{
    public class Users
    {
        public List<Domain.Entities.User> GetConnectedUsers()
        {
            List<Persistence.Entities.User> usersFromDb = new List<Persistence.Entities.User>();
            List<Domain.Entities.User> usersToReturn = new List<Domain.Entities.User>();

            // take users from database, make domain objects

            return usersToReturn;
        }
    }
}

我不想在我的应用层写Persistence.Entities.UserDomain.Entities.User

我该怎么做才能解决这个问题?


到目前为止我发现,我可以在 C# 中为 using 使用别名,如下所示:

using Persistence = Persistence.Entities;
using Domain = Domain.Entities;

namespace Application
{
    public class Users
    {
        public List<Domain.User> GetConnectedUsers()
        {
            List<Persistence.User> usersFromDb = new List<Persistence.User>();
            List<Domain.User> usersToReturn = new List<Domain.User>();

            // take users from database, make domain objects

            return usersToReturn;
        }
    }
}

也许有更好的方法来处理这个问题?

或者我应该为我的域层对象添加一些后缀? UserBO(对于 BusinessObject)。这是正确的吗?很抱歉,如果这是一个愚蠢的问题,但正如我所写 - 我没有开发那么多层的经验。

我认为我要做的最后一件事是为我的数据库实体命名更改,因为表比域对象多得多,因此名称尽可能短在持久层比在域层更有用。

简短回答:我将我的业务层称为“服务”,因此围绕用户对象提供服务的服务我将称为 UserService。您从 business/service 层实例化的对象不是“一个”用户,而是一个 UserBO 或 UserService。我实际上将 model/DTO 对象称为 User、UserModel 或 UserDTO。我不喜欢像 BO 这样的缩写,而且我也喜欢 Service 的措辞,所以这是我的偏好。 YMMV :-)