最佳的方式来恢复域对象(Optimum Way To Restore Domain Object)

2019-09-16 08:58发布

这是这样一个简单而常见的情况我不知道怎么做,我设法到现在为止,为什么我现在有问题。

我有这样的对象(基础设施组件的一部分)

public class Queue {}

public class QueueItem
{
    public QueueItem(int blogId,string name,Type command,object data)
    {
        if (name == null) throw new ArgumentNullException("name");
        if (command == null) throw new ArgumentNullException("command");
        BlogId = blogId;
        CommandType = command;
        ParamValue = data;
        CommandName = name;
        AddedOn = DateTime.UtcNow;
    }


    public Guid Id { get; internal set; }
    public int BlogId { get; private set; }
    public string CommandName { get; set; }
    public Type CommandType { get; private set; }
    public object ParamValue { get; private set; }
    public DateTime AddedOn { get; private set; }
    public DateTime? ExecutedOn { get; private set; }
    public void ExecuteIn(ILifetimeScope ioc)
    {
        throw new NotImplementedException();
    }
}

这将在这样的另一个组件创建

 var qi = new QueueItem(1,"myname",typeof(MyCommand),null);

没有什么不同寻常这里。 然而,这个对象将被发送牛逼OA储存库,这将是persisted.The Queue对象会要求项目库。 该库应该重新创建QueueItem对象。

然而,正如你看到的,QueueItem性质不变,AddedOn财产,应仅在创建的项目设置一次。 Id属性将由Queue对象(这并不重要)中设定。

现在的问题是我应该如何重新创建资源库中的QueueItem? 我可以有另一种构造,这将需要对所有属性的每一个值,但我不希望可用于将最初创建队列项的组件构造。 该仓库是一个不同的组件,所以内部将无法正常工作的一部分。

我想过提供一个工厂方法类QueueItem {/ * ..rest的定义。* /

     public static QueueItem Restore(/* list of params*/){}
   }

其中至少清除意图,但我不知道为什么我不喜欢这种方式。 我也可以强制执行的项目创造只能由队列,但这意味着要通过队列作为一个依赖于回购这又不是我愿意的话。 为了对此有一个具体的工厂对象,也似乎矫枉过正的方式。

基本上我的问题是: 什么是重新创建存储库中的对象的最佳途径, 在不暴露特定造物功能 ,另一个消费对象

更新

需要注意的是通过库我指的是模式本身是一种抽象,而不是通过一个ORM的包装是很重要的。 不要紧,如何或在哪里域对象持久化。 它的问题是如何能够通过信息库重新创建。 另一个重要的事情是,我的域模型 持久模式 不同 。 我使用一个RDBMS,但我认为这只是一个实现细节,其不应承担任何意义,因为我在寻找一个不依赖于特定的存储接入方式。

虽然这是一个特定的方案,它可以应用到基本上将由回购恢复的每个对象。

UPDATE2

好吧,我不知道我能怎么样AutoMapper忘记。 我是错误的印象,它不能映射私有字段/ setter方法,但是是可以的,我觉得这是最好的解决办法。

其实我可以说最佳的解决方案(IMO)是为了:

  1. 直接反序列化,如果有的话。
  2. 自动映射。
  3. 域对象本身的工厂方法。

前两个不需要对象做特别点儿,而第三个要求对象为这种情况下(的方式进入有效状态的数据)的功能。 它有明确的意图,但它几乎做了映射器的工作。

更新

要回答自己,在这种情况下,最佳的方法是使用一个工厂方法。 起初,我选择了Automapper,但我发现自己使用工厂方法较多。 Automapper有时可能有用,但在相当多的情况下,它是不够的。

Answer 1:

一个ORM框架将照顾这对你。 你只需要告诉它补充水分的对象和领域类的普通实例将提供给你(有时你只需要声明属性为虚拟或保护,NHibernate的为例)。 究其原因是因为引擎盖下,他们通常从基类派生代理对象进行操作,让您保持这些基类完好无损。

如果你想,虽然实现自己的持久层,它是一个整体诺特尔故事。 再水化从所述数据库中的对象不破坏原本在对象中定义的范围的限制可能涉及反射。 你还必须考虑很多方面的担忧:如果你的对象有到另一个对象的引用,必须补充水分之前那一个,等等。

你可以看看该教程: 建立自己的数据访问层 ,虽然我不建议重塑在大多数情况下,轮。



Answer 2:

你刚才谈到的对象本身的工厂方法。 但是,DDD指出,实体应该由工厂创建。 所以,你应该有一个可以创造新的QueueItems和恢复现有QueueItems一个QueueItemFactory。

好吧,我不知道我能怎么样AutoMapper忘记。

我希望我能忘掉AutoMapper。 只是看着狰狞的API让我颤抖了我的脊椎。



文章来源: Optimum Way To Restore Domain Object