- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是一个如此简单和常见的场景,我想知道我是如何管理到现在的以及为什么我现在遇到问题。
我有这个对象(基础设施程序集的一部分)
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);
这里没有什么不寻常的。然而,这个对象将被发送到一个存储库,在那里它将被持久化。Queue 对象将向存储库询问项目。存储库应重新创建 QueueItem 对象。
但是,如您所见,QueueItem 属性是不变的,AddedOn 属性应该只在创建项目时设置一次。 Id 属性将由 Queue 对象设置(这并不重要)。
问题是我应该如何在存储库中重新创建 QueueItem?我可以有另一个构造函数,它需要所有属性的每个值,但我不希望该构造函数可用于最初创建队列项的程序集。存储库是另一个程序集的一部分,因此内部将不起作用。
我想过提供一个工厂方法 类队列项 { /* ..其余定义.. */
public static QueueItem Restore(/* list of params*/){}
}
这至少清除了意图,但我不知道为什么我不喜欢这种方法。我也可以强制仅由 Queue 创建项目,但这意味着将 Queue 作为依赖项传递给 repo,这又不是我想要的。为此拥有一个特定的工厂对象,似乎也太过分了。
基本上我的问题是:在存储库中重新创建对象的最佳方式是什么,不会将特定的创建功能暴露给另一个消费者对象。
更新
重要的是要注意,我所说的存储库是指作为抽象的模式本身,而不是 ORM 的包装器。域对象的持久化方式或位置并不重要。存储库如何重新创建很重要。另一件重要的事情是我的域模型不同于持久性模型。我确实使用 RDBMS,但我认为这只是一个不应该具有任何重要性的实现细节,因为我正在寻找不依赖于特定存储访问的方法。
虽然这是一个特定的场景,但它基本上可以应用于将由存储库恢复的每个对象。
更新2
好吧,我不知道我怎么会忘记 AutoMapper。我的错误印象是它不能映射私有(private)字段/setter,但它可以,我认为这是最好的解决方案。
事实上,我可以说最佳解决方案 (IMO) 是有序的:
前两个不要求对象做任何特别的事情,而第三个要求对象为这种情况提供功能(一种输入有效状态数据的方法)。它有明确的意图,但它几乎完成了映射工作。
回答 已更新
回答我自己,在这种情况下,最佳方法是使用工厂方法。最初我选择了 Automapper,但我发现自己更频繁地使用工厂方法。 Automapper 有时很有用,但在很多情况下它是不够的。
最佳答案
ORM 框架会为您解决这个问题。你只需要告诉它重新水化一个对象,域类的一个常规实例就会被提供给你(有时你只需要将属性声明为虚拟的或 protected ,例如在 NHibernate 中)。原因是因为在幕后,它们通常对从您的基类派生的代理对象进行操作,从而使您可以保持这些基类的完整性。
不过,如果您想实现自己的持久层,那就完全是另外一回事了。在不破坏对象中最初定义的范围约束的情况下从数据库中重新组合对象很可能涉及反射。您还必须考虑很多附带问题:如果您的对象引用了另一个对象,您必须先重新水合那个对象,等等。
你可以看看那个教程:Build Your Own dataAccess Layer尽管在大多数情况下我不建议重新发明轮子。
关于oop - 恢复域对象的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10040950/
有什么方法可以恢复删除的元素吗? 这是我删除元素的代码 myFunction() { var width = window.innerWidth; var February = doc
我有一个 TokuDB 表,由于某种原因缺少 ***_status.tokudb 文件。 我还不确定文件是否由于 TokuDB 崩溃而丢失。 问题是: 有没有办法从主要文件和关键文件(我可以从 tok
我正在 Windows 7 (x86) 上运行带有 Workbench 6.3.8 的 32 位 MySQL Server 5.7.22 本地实例(必须选择 32 位版本 - 所以,较旧的版本)。 我
1、备份 <% SQL="backup database 数据库名 to disk='"&Serve
1、ASP中怎么实现SQL数据库备份、恢复! 答:asp在线备份sql server数据库: 1、备份 <% SQL="ba
我在 R 中使用 stats::filter 函数来理解 R 中的 ARIMA 模拟(如在函数 stats::arima.sim 中)和估计。我知道 stats::filter 将线性过滤器应用于向量
我已经浏览了示例应用程序的文档和代码,并发现 files/objectbox/objectbox/data.mdb 是存储所有数据的默认文件。 假设我的理解是正确的,我有几个问题找不到文档: 我想在我
为了恢复非续订订阅类型的 InAppPurchase,我已经实现了服务器来处理此问题。 但在购买过程中,iTunes 有时不会要求用户验证他们的卡详细信息, 在这种情况下,它会在后台发送应用程序并显示
我的问题是寻找cocos2d游戏期间暂停/恢复状态(包括所有需要保存的数据信息)的设计解决方案。 包括但不限于以下情况: 1).用户选择退出,然后弹出一个对话框供用户选择“直接退出”、“暂停”; 2)
在 Mercurial 中,我有一个旧的变更集,除了对单个文件的更改外,它都很好。我将如何恢复对该单个文件的更改? 即使只是能够在上一个变更集中查看文件的状态也会很好,然后我可以剪切和粘贴。 我的 M
我的一项职能遇到了困难。我想做的是计时器在页面加载后立即启动,并且只有一个带有启动/恢复的按钮。我无法在代码中找出需要更改功能的位置。有人可以帮助我吗?谢谢! HTML: , Javascr
我正在阅读Scrap your type classes 。这为类型类提供了替代方案。然而,我被Paul Chiusano的评论所困扰。其中讨论了恢复 do 表示法 语法。 坦白说,我无法理解 ret
当 OrientDB 因某人重新启动机器而非正常关闭时,OrientDB 最终会处于数据恢复失败的状态。对于如何从这种不正常的关闭中正常恢复有什么建议吗?我们正在寻找系统在断电期间能够自行恢复的方法。
我正在构建一个 Electron 应用程序,如果发生崩溃,它必须重新加载渲染进程窗口。 目前我可以从主进程重新启动应用程序 app.relaunch(); app.quit(); 但我无法检测到窗口崩
我有 3 个 Activity ,比如说 MainActivity、 Activity 2 和 Activity 3。 在 MainActivity 中,我有一个按钮(开始/停止),当我单击此按钮时,
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve thi
Twilio 是否支持暂停和恢复内容播放。换句话说,我有相当长的文件将播放给调用者,并且我正在尝试找到一种方法来实现暂停和恢复功能。在播放某些内容的过程中,我希望用户能够按数字暂停,然后再次按数字从音
我已经提交了 A、B、C、D 和 E。我意识到在提交 B 中发生了一些非常糟糕的事情,所以我想回到 A,这次正确地进行之前搞砸了 B 的更改,然后重新应用 C 、 D 和 E 自动。 您可能想知道为什
我的一个文件被“标记为文本”,图标也发生了变化。实际上这是一个 PHP 文件。我尝试过使用 Help -> Find Action -> Mark As 尝试将其恢复为 PHP 突出显示,但它不起作用
我有一些 SSE 程序,可以将循环中的内存归零,当指针未对齐时,它会引发 SIGSEGV进入我的处理程序。我可以在此类处理程序中获取更多信息吗例行公事,现在我不知道它是在哪里完成的,我也可以吗以某种可
我是一名优秀的程序员,十分优秀!