从我已阅读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>();
}
}
鉴于上述情况,我将如何填充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>();
}
}
持久层应该能够通过反射来设置只读属性的值。 你可以再前进一步,仅暴露问题块集合作为一个只读的收集,以确保它只能从实体本身内进行修改。
我会追加另一种观点认为:POCO状态是在不依赖于任何框架对象。 一个POJO的维基定义是有意义得多给我那么一个POCO:
- http://en.wikipedia.org/wiki/Plain_Old_Java_Object
套用该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