这是这样一个简单而常见的情况我不知道怎么做,我设法到现在为止,为什么我现在有问题。
我有这样的对象(基础设施组件的一部分)
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)是为了:
- 直接反序列化,如果有的话。
- 自动映射。
- 域对象本身的工厂方法。
前两个不需要对象做特别点儿,而第三个要求对象为这种情况下(的方式进入有效状态的数据)的功能。 它有明确的意图,但它几乎做了映射器的工作。
答 更新
要回答自己,在这种情况下,最佳的方法是使用一个工厂方法。 起初,我选择了Automapper,但我发现自己使用工厂方法较多。 Automapper有时可能有用,但在相当多的情况下,它是不够的。