【问题标题】:DTO mapping using interface使用接口的 DTO 映射
【发布时间】:2015-06-20 15:47:29
【问题描述】:

[编辑] 在阅读之前,我已经设法通过简单地转换不同的数据类来解决这个问题。 我已经更新了代码,但欢迎大家提供提示!

尊敬的 stackoverflow 用户,

首先我想说的是,我知道这个问题很可能与 Automapper 相关。 不幸的是......由于某种原因,NuGet 不愿意安装 Automapper。 因此,我决定尝试在 DTO 和实体之间编写手动映射器。 我对 IoC 和 DI 有点陌生,我猜这是我的实现不正确的主要原因。

基本上我有 5+ 个不同的数据网格,它们都链接到不同的表,因此具有不同的结构。 但是,它们都具有完全相同的消息处理程序,这些消息处理程序指向视图模型中的相同方法,这些方法将负责添加、删除和修改。

处理删除的代码如下所示。

在视图模型中:

 public void KeyDown(EventArgs eventArgs, object sourceSender)
    {
        var dataGridContext = sourceSender as DataGrid;
        var keyEventArgs = eventArgs as KeyEventArgs;
        if (keyEventArgs == null) return;
        switch (keyEventArgs.Key)
        {
            case Key.Delete:
                if (dataGridContext != null)
                        foreach (var selectedEntity in dataGridContext.SelectedItems.OfType<IEntityObject>())
                        {
                            _mainModel.DeletePendingEntityObject(selectedEntity);
                        }
                break;
        }
    }

在模型中:

    public void DeletePendingEntityObject<TEntity>(TEntity sender) where TEntity : IEntityObject
    {
         if (sender.State == EntityState.Added)
         {
             _pendingEntityObjects.Remove(sender);
             return;
         }
         AddPendingEntityObject(sender, EntityState.Deleted);
    }

处理添加和修改的代码如下所示:

在视图模型中:

 public void RowEditEnding(object sender)
    {
        var dataGridContext = sender as DataGrid;
        if (_isNewItem && dataGridContext != null)
        {
            var item = dataGridContext.CurrentItem as IEntityObject;
            _mainModel.AddPendingEntityObject(item, EntityState.Added);
            _isNewItem = false;
        }

        else if (dataGridContext != null)
        {
            var item = dataGridContext.CurrentItem as IEntityObject;
            if (item == null) return;
            _mainModel.AddPendingEntityObject(item, EntityState.Modified);
        }
    }

在模型中:

    public void AddPendingEntityObject<TEntity>(TEntity sender,
 EntityState entityState) where TEntity : IEntityObject
    {
        sender.State = entityState;
        _pendingEntityObjects.Add(sender);
    }

现在,所有这些都可以完美运行,直到我想创建一个映射器,将 DTO 对象映射到它们的实体,然后将其保存到数据库中。 我认为实现是不正确的,因为我必须在接口中添加我希望在 DtoMapper.cs 中可映射的每个属性(如下所示)。最终导致所有 DTO 的变量都与它们无关。

这是我的尝试:

 foreach (var item in _pendingEntityObjects)
            {
                using (var context = new CentralEntities())
                {
                    var entityObj = new DtoMapper<IEntityObject>(item);
                    context.Entry(entityObj.TranslatedObj).State = item.State;
                    context.SaveChanges();
                }
            }

这是 DtoMapper.cs 的样子:

    public DtoMapper(T t)
    {
        if (t.GetType() == typeof(Table1Dto))
        {
            var table1Obj = t as Table1Dto;
            if(table1Obj != null)
            TranslatedObj = new table_1
            {
                id = table2Obj.Id,
                table1Code = table1Obj.Table1Code,
                reference = table1Obj.Reference
            };
        }
        else if (t.GetType() == typeof (Table2Dto))
        {
            var table2Obj = t as Table2Dto;
            if(table2Obj != null)
            TranslatedObj = new table_2
            {
                id = table2Obj.Id,
                table2Code = table2Obj.Table2Code,
                reference = table2Obj.Reference
            };
        }
    }

    public object TranslatedObj { get; set; }

我将如何解决这个问题以保持代码干净和通用方法/映射器可以与任何数据网格一起使用? 提前致谢!

【问题讨论】:

    标签: c# wpf database entity-framework mvvm


    【解决方案1】:

    检查抽象工厂设计模式。您应该创建一个工厂来为您的通用 T 类型 DTO 解析映射器。

    https://en.wikipedia.org/wiki/Abstract_factory_pattern

    【讨论】:

      猜你喜欢
      • 2019-07-07
      • 1970-01-01
      • 2020-02-04
      • 2012-11-23
      • 2016-04-13
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多