将域对象映射到持久对象

时间:2014-05-26 16:02:53

标签: c# mongodb architecture domain-object

这不是一个明确答案的问题,但我需要一些建议。关于这个话题可能会有很多不同的意见。

我正在尝试将我的架构从愚蠢的实体转移到富域对象。在我当前的版本中,我使用具有readonly属性的抽象域对象和表示业务逻辑的方法:

abstract class Project
{
  public string PropertyName { get; protected set; }
  public void Setup(SetupData data)
  {
    ...
    Save();
  }
  protected abstract void Save();
}

我从它们派生出来实现到持久性实体的映射并实现保存逻辑:

class MongoProject
{
  MongoProject(ProjectDocument document, Action<ProjectDocument> save)
  {
    MapFrom(document);
  }
  public override Save()
  {
    MapTo(document);
    save(document);
  }
}

这很容易,项目总是有效的,因为它没有公共设置器,可以测试,甚至可以测试文档。

但我也意识到了一些问题:

  1. 我总是忘记映射一些属性,没有办法告诉MongoProject它必须序列化什么。
  2. 有时候实现映射是相对复杂的,因为你不知道save方法里面发生了什么变化,特别是在项目是一个复杂的聚合根的情况下。在我的情况下,使用mongodb实现持久化非常容易,但这是实体框架的噩梦。
  3. 如何解决应用程序中的持久性问题?是否有其他解决映射问题的方法?

1 个答案:

答案 0 :(得分:0)

这是一个广泛的问题。

我不会在同一个类中实现我的域对象和我的数据访问层(保存到db,file,cloud等)。需要分离关注点。您的域对象不必知道如何将自己保存到数据库中。

我要做的是在类中创建我的域对象,并创建一个单独的数据访问层,它负责将我的数据保存到我希望保存到的任何来源。 这样,每次要将实体保存到其他位置时,对象模型都不关心,您根本不需要更改它。

为了将POCO对象映射到数据库实体,使用AutoMapper,它将为您节省大量样板代码,并且您只需配置一次

例如:

// Domain object
public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

// Data Access Layer
public class MongoAccessLayer : IDal
{
    public void SaveEntity<T>(T entity)
    {
        // Save logic here
    }

    public void LoadEntity<T>(T entity)
    {
    // Load logic here
    }
}

// Interface defining what the access layer should look like
public interface IDal
{
    void SaveEntity<T>(T entity);
    void LoadEntity<T>(T entity);
}