为了账号安全,请及时绑定邮箱和手机立即绑定

在微服务中创建域模型和视图模型的正确方法

在微服务中创建域模型和视图模型的正确方法

C#
HUX布斯 2022-06-12 16:18:02
我正在尝试创建一个微服务,并且我正在努力确保我遵循最佳实践/模式来设计我的对象。我计划分离我的对象,以便有一个用于返回(使用 dapper 查询)到客户端(下面的类代码)和一个实际执行状态更改(代码不在这个问题中),它将提交更改到 db我在数据库中有一个实体CalendarEvents并且我有一个视图模型用于调用CalendarEvent它,它具有用于映射的每个实体字段的基本属性,并且我有一堆其他属性为 CalendarEvent 是实体字段的聚合。问题:填充此 CalendarEvent 对象(视图模型)的正确方法是什么,如果从从数据库读取的实体创建时所有属性都通过构造函数传递,还是有更好的方法来做到这一点。我应该采用 _dateformat 还是有更优雅的方式(这来自配置文件)下面是我的 CalendarEntity 类(用作视图模型的类)此外,如果有人可以通过我的方法发现任何其他问题(可能很多),我将不胜感激。
查看完整描述

1 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

我将假设您使用的是 Web Api,但同样的原则也适用于 MVC 应用程序。我通常有一个映射器层,它接受一个域对象并将其映射到视图模型或 dto。这样,您可以在任何时候想要返回相同的视图模型时重用映射器。因此,如果您对视图模型进行更改,它都位于一个地方。


请参阅下面的代码以回答问题 1。


问题 2:为什么您的 mircoservice 关心客户想要的日期。如果您发回 utc 日期,那么如果客户想要它的格式,那么由他们来格式化。


//Fake view model

public class CalendarEventViewModel

{

    public int EventId { get; set; }


    public string Title { get; set; }


    public DateTime? StartDateTimeUtc { get; set; }


    public DateTime? EndDateTimeUtc { get; set; }


    public string Summary { get; set; }


    public bool IsApproved { get; set; }


    public string TimeZoneId { get; set; }

}



public interface IMapper<in TIn, out TOut>

{

        TOut Map(TIn model);

}


public class CalendarEventViewModelMapper : IMapper<CalendarEvent, CalendarEventViewModel>

{

    public CalendarEventViewModel Map(CalendarEvent model)

    {

        return new CalendarEventViewModel

        {

            EndDateTimeUtc = model.EndDateTimeUtc,

            EventId = model.EventId,

            IsApproved = model.IsApproved,

            StartDateTimeUtc = model.StartDateTimeUtc,

            Summary = model.Summary,

            TimeZoneId = model.TimeZoneId,

            Title = model.Title

        };

    }

}


[Route("api/Values")]

public class ValuesController 

       public ValuesController( IMapper<CalendarEvent, CalendarEventViewModel> calendarMapper)

       {

           _calendarMapper = calendarMapper;

       }


        // GET api/values/5

        [HttpGet("{id}")]

        public IActionResult Get(int id)

        {


            var calendarEvent = GetMyCalendarEventFromDB(id);


            return this.Ok(_calendarMapper.Map(calendarEvent));

        }


        private CalendarEvent GetMyCalendarEventFromDB(int id)

        {

            return new CalendarEvent("yyyy-dd-MM")

            {

                EndDateTimeUtc = DateTime.UtcNow.AddHours(3),

                EventId = id,

                IsApproved = true,

                StartDateTimeUtc = DateTime.UtcNow.AddHours(2),

                Summary = "My magical Event",

                TimeZoneId = "UTC",

                Title = "Magical Event"

            };

        }

    }

}

//img1.sycdn.imooc.com//62a5a17b0001e1ab02910351.jpg

查看完整回答
反对 回复 2022-06-12
  • 1 回答
  • 0 关注
  • 131 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信