具有EF6,域,DTO,ViewModel的多层应用程序中对象的命名约定

时间:2019-07-11 19:16:42

标签: c# architecture naming-conventions

我正在启动具有多个层和多种客户端类型(WebApp,WebAPI,Xamarin和Windows)的新项目。我想尝试“清洁架构”。

我以前的应用程序没有应用程序层,我的视图模型直接与实体框架DbContext耦合。我对ASP.NET和Web开发的经验也很少。

是的,这是与以下问题类似的问题:

Naming conventions for model in multi layer application

File naming convention for layers

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

>

问题

因此,在持久层中,我有一个称为“用户”的POCO类。

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

在“域”层中,我还有一个名为“用户”的类。

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

在Windows和Android客户端中,我将创建ViewModels,但是我可以将其命名为“ UserVM”,这不是问题。在WebAPI中将有“ UserDTO”,因此也没有问题。但是在应用程序层中,我想创建一个使用两个名称相同的类的方法:

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;
        }
    }
}

也许有更好的方法来解决这个问题?

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

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

2 个答案:

答案 0 :(得分:1)

简短的答案:我将业务层称为“服务”,因此围绕User对象提供服务的服务将称为UserService。您从业务/服务层实例化的对象不是“ a”用户,而是UserBO或UserService。我实际上将模型/ DTO对象称为用户,用户模型或用户DTO。我不喜欢BO这样的缩写,而且我也喜欢Service的措辞,所以这是我的偏爱。 YMMV:-)

答案 1 :(得分:1)

如果名称太长,我们可以按如下方式重命名:

using BO = Domain.Entities;
using DTO = Persistence.Entities;

// then use them like:
var name = DTO.User.Name;

关于使用名称空间将其分开而不使用后缀的任何看法(优点,缺点):

// Business layer
namespace Application.Models.BO {
   public class User {}
}
// Persistence layer
namespace Application.Models.DTO {
   public class User {}
}

然后我们可以按以下方式使用它们:

using Application.Models;

namespace Application.SomeModule {
  public class SomeClass {
    public SomeClass(IDataProvider dataProvider);

    void UseSomeData() {
      // auto mapper would resolve BO.User to DTO.User and ask the persistence layer (or EF)...
      var user = dataProvider.GetObject<BO.User>("object id");
    }

  }
}