我一直在使用Steven Sanderson的Apress书籍“Pro ASP.NET MVC Framework”学习ASP.NET MVC框架。为此,我一直在尝试一些我不熟悉的项目,但事实上我应该做的事情,即:
我有一个MVC网络应用程序,域库,测试库。
在我的数据库中,我的域项具有表示为int标识列的Id。在我的域类中,setter是内部的,因此只有存储库可以设置它。
所以我的quandries /问题是:
使用数据库数据存储时其他人做了什么?我想很多人在数据库中使用整数Id作为唯一标识符,然后需要将其设置为对象,而不是其他任何东西。
答案 0 :(得分:1)
你不能在构造过程中设置对象的ID并将它们设为只读,而不是通过setter方法设置ID吗?
或者您是否需要在其他时间设置ID。如果是这样的话,你能解释一下原因吗?
编辑:
是否可以将ID与域对象分开?除了存储库之外的其他任何东西都需要知道ID吗?
从域对象中删除ID字段,并让您的存储库实现使用私有字典跟踪对象ID。这样,任何人都可以创建域对象的实例,但是他们不能用ID做傻事。
这样,域对象的ID就是存储库实现决定的 - 它们可以是来自数据库,URL或文件名的内容。
如果有人在存储库之外创建了一个新域对象并说,尝试将其保存到存储库,则可以查找对象的ID并根据需要进行保存。如果ID不存在,您可以抛出异常,表示您需要使用存储库方法创建对象,或者为其创建新ID。
有什么东西阻止你使用这种模式吗?
答案 1 :(得分:0)
您可以使用InternalsVisibleTo属性。它允许从测试中看到装配中的类型(假设它们位于不同的装配中)。
否则,您可以将该属性保留为只读外部对象,但同时具有一个具有ID参数的构造函数并设置ID属性。然后你可以调用那个构造函数。
希望这有帮助。