这不是一个明确答案的问题,但我需要一些建议。关于这个话题可能会有很多不同的意见。
我正在尝试将我的架构从愚蠢的实体转移到富域对象。在我当前的版本中,我使用具有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);
}
}
这很容易,项目总是有效的,因为它没有公共设置器,可以测试,甚至可以测试文档。
但我也意识到了一些问题:
如何解决应用程序中的持久性问题?是否有其他解决映射问题的方法?
答案 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);
}