据我所知,POCO类应该是持久性无知的,不应该包含对存储库的引用。
Q1。鉴于上述情况,我将如何填充QuestionBlocks集合?我已经读过,POCO应该包含行为,所以你不要以贫血模型结束,所以我有点困惑,因为如果没有持久性,应该如何做到这一点。如果是这样的话,你会把什么样的行为放在POCO中?
实施例
public class Survey
{
public int SurveyId { get; set; }
public string Title { get; set; }
public int BrandId { get; set; }
public DateTime Created { get; set; }
public List<SurveyQuestionBlock> QuestionBlocks { get; set; }
[ResultColumn]
public string Name { get; set; }
/// <summary>
/// Constructor
/// </summary>
public Survey()
{
Created = DateTime.Now;
QuestionBlocks = new List<SurveyQuestionBlock>();
}
}
答案 0 :(得分:8)
我会附加另一个视图:POCO声明不依赖于任何框架的对象。对于POCO来说,POJO的维基定义对我来说更有意义:
为了解释POJO的维基定义,我们可以说POCO对象可能不会被强制:
<强>予。扩展预先指定的类:
public class MyClass : AnyFramework.ObjectBase {...
<强> II。实施预先指定的接口
public class MyClass : AnyFramework.IHaveDependency {...
<强> III。包含预先指定的属性
[AnyFramework.KeyAttribute]
public class MyClass {...
鉴于这个(几乎任何其他东西都是允许的),意思是注意对象状态。换句话说,如果对象将检查业务逻辑,那么它是正确的。
但任何POCO对象都可以在 框架中使用。今天主要是ORM负责持久性。所有应用程序层都使用POCO对象,而数据层负责加载和持久化(CRUD)。这主要通过这些POCO对象的代理来完成。
因此,POCO可以用作完整的业务对象,可以自行处理(检查集合项的正确性,属性......)。这使它与DTO不同
答案 1 :(得分:4)
鉴于上述情况,我将如何填充QuestionBlocks集合?
从数据库读取时,持久性基础结构应填充QuestionBlocks集合 - 重构。重构不应该调用行为,它应该只在POCO上设置适当的字段。这是存储库的责任。存储库通常从应用程序服务引用,该服务器为调用实体行为设置阶段。
如果是这样的话,你会把什么样的行为放在POCO中?
POCO实体中的行为应关注对实体本身进行更改以及维护不变量 - 即确保实体的完整性。在您的示例中,POCO上最简单的行为应该是在调查中向集合添加新问题块的方法。理想情况下,您可以将调查实体上的许多属性设为只读:
public class Survey
{
public int SurveyId { get; private set; }
public string Title { get; private set; }
public int BrandId { get; private set; }
public DateTime Created { get; private set; }
public IList<SurveyQuestionBlock> QuestionBlocks { get; private set; }
public string Name { get; private set; }
public void AddQuestionBlock(string questionBlockInfo)
{
this.QuestionBlocks.Add(new SurveyQuestionBlock(...));
}
public Survey()
{
Created = DateTime.Now;
QuestionBlocks = new List<SurveyQuestionBlock>();
}
}
持久层应该能够通过反射设置只读属性的值。您可以更进一步,只将问题块集合公开为只读集合,以确保它只能在实体本身内进行修改。