5

从我读过的内容来看,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>();
        }
    }
4

2 回答 2

8

我会附加另一个观点:POCO 状态用于不依赖于任何框架的对象。POJO 的 wiki 定义对我来说比 POCO 的定义更有意义:

套用 POJO 的 wiki 定义,我们可以说 POCO 对象可能不会被迫:

一、扩展预设类:

public class MyClass : AnyFramework.ObjectBase {...

二、实现预先指定的接口

public class MyClass : AnyFramework.IHaveDependency {...

三、包含预先指定的属性

[AnyFramework.KeyAttribute]
public class MyClass  {...

考虑到这一点(几乎允许其他任何事情),就意味着要注意对象状态。换句话说,如果对象会检查业务逻辑,那就是正确的

但是任何 POCO 对象都可以框架中使用。今天它主要用于负责持久性的 ORM。所有应用层都在使用 POCO 对象,而数据层负责加载和持久化(CRUD)。这主要是通过这些 POCO 对象的代理完成的。

因此,POCO 可以用作完整的业务对象,它可以照顾自己(检查集合项、属性的正确性......)。这使它与 DTO 不同

于 2012-11-29T19:05:24.013 回答
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>();
        }
    }

持久层应该能够通过反射设置只读属性的值。您可以更进一步,仅将问题块集合公开为只读集合,以确保只能从实体本身内部对其进行修改。

于 2012-11-29T18:54:35.517 回答