POCO的,行为和Peristance Igorance(POCO's, behavior

2019-06-21 09:05发布

从我已阅读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>();
        }
    }

Answer 1:

鉴于上述情况,我将如何填充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>();
        }
    }

持久层应该能够通过反射来设置只读属性的值。 你可以再前进一步,仅暴露问题块集合作为一个只读的收集,以确保它只能从实体本身内进行修改。



Answer 2:

我会追加另一种观点认为: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



文章来源: POCO's, behavior and Peristance Igorance