亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在微服務中創建域模型和視圖模型的正確方法

在微服務中創建域模型和視圖模型的正確方法

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"

            };

        }

    }

}

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

查看完整回答
反對 回復 2022-06-12
  • 1 回答
  • 0 關注
  • 147 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號