我正在启动具有多个层和多种客户端类型(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.User
和Domain.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层中使用尽可能短的名称更为有用。
答案 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");
}
}
}