C# 架构模型、DTO等。。MongoDB、MVC等

C# 架构模型、DTO等。。MongoDB、MVC等,c#,asp.net-mvc,mongodb,architecture,C#,Asp.net Mvc,Mongodb,Architecture,我正在设计一个从sql和其他数据源获取数据并存储在MongoDB中的项目 我有映射到文档的类,例如: public class Event { public virtual int Id { get; set; } public virtual int Name { get; set; } public virtual int Description { get; set; } public virtual IEnumerable<string> At

我正在设计一个从sql和其他数据源获取数据并存储在MongoDB中的项目

我有映射到文档的类,例如:

public class Event
{
    public virtual int Id { get; set; }
    public virtual int Name { get; set; }
    public virtual int Description { get; set; }
    public virtual IEnumerable<string> Attendees { get; set; }
}
例如,在我的应用程序中,我有一个EventController,它返回事件列表。 我还想让“真正”的补水用户参加我的活动

因此,目前,我在不同的项目/名称空间中有上述两个类-事件和用户。在本例中,它们位于MyApp.DTOs中

然后我有另一个名为MyApp.Model的名称空间

它几乎有重复的类

public class Event
{
    public virtual int Id { get; set; }
    public virtual int Name { get; set; }
    public virtual int Description { get; set; }
    public virtual IEnumerable<User> Attendees { get; set; }
}

public class User
{
    public virtual int Id { get; set; }
    public virtual int FirstName { get; set; }
    public virtual int LastName { get; set; }
}
公共类事件
{
公共虚拟整数Id{get;set;}
公共虚拟整数名{get;set;}
公共虚拟整数描述{get;set;}
公共虚拟IEnumerable与会者{get;set;}
}
公共类用户
{
公共虚拟整数Id{get;set;}
公共虚拟int FirstName{get;set;}
公共虚拟int LastName{get;set;}
}
然后,为了保持控制器简洁,我有一个返回Model.event的事件服务,并在其中封装了repository/db逻辑:

获取事件文档(DTOs.event) 获取用户文档(DTOs.user) 使用automapper创建模型。用户


我只是想知道是否有更好的方法,因为这会导致大量重复代码

不幸的是,为了使您的模型与您的域不同,您需要进行一些代码复制,尤其是在大多数情况下DTO与您的模型匹配时

这主要是一种偏好,但我认为模型应该公开给您的视图,而和域或映射对象无关

public class Event
{
    public virtual int Id { get; set; }
    public virtual int Name { get; set; }
    public virtual int Description { get; set; }
    public virtual IEnumerable<User> Attendees { get; set; }
}

public class User
{
    public virtual int Id { get; set; }
    public virtual int FirstName { get; set; }
    public virtual int LastName { get; set; }
}