C# POCO&x27;s、 行为和经历

C# POCO&x27;s、 行为和经历,c#,domain-driven-design,persistence,poco,C#,Domain Driven Design,Persistence,Poco,据我所知,POCO类应该是持久性无关的,并且不应该包含对存储库的引用 Q1.鉴于上述情况,我将如何填充问句块集合?我已经读到,POCO应该包含行为,这样你就不会以贫血模型结束,所以我有点困惑,如果没有坚持,应该怎么做。如果是这样的话,你会在POCO中采取什么样的行为 Ex: public class Survey { public int SurveyId { get; set; } public string Title { get; set; }

据我所知,POCO类应该是持久性无关的,并且不应该包含对存储库的引用

Q1.鉴于上述情况,我将如何填充问句块集合?我已经读到,POCO应该包含行为,这样你就不会以贫血模型结束,所以我有点困惑,如果没有坚持,应该怎么做。如果是这样的话,你会在POCO中采取什么样的行为

Ex:

 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>();
        }
    }
public class MyClass : AnyFramework.ObjectBase {...
公共类调查
{
public int SurveyId{get;set;}
公共字符串标题{get;set;}
public int BrandId{get;set;}
已创建公共日期时间{get;set;}
公共列表问题块{get;set;}
[结果列]
公共字符串名称{get;set;}
/// 
///建造师
/// 
公众调查()
{
Created=DateTime.Now;
QuestionBlocks=新列表();
}
}
鉴于上述情况,我将如何填充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>();
        }
    }
公共类调查
{
public int SurveyId{get;private set;}
公共字符串标题{get;private set;}
public int BrandId{get;private set;}
已创建公共日期时间{get;private set;}
公共IList问题块{get;private set;}
公共字符串名称{get;private set;}
public void AddQuestionBlock(字符串questionBlockInfo)
{ 
添加(新的SurveyQuestionBlock(…);
}
公众调查()
{
Created=DateTime.Now;
QuestionBlocks=新列表();
}
}

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

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

为了解释POJO的wiki定义,我们可以说POCO对象可能不会被迫:

I.扩展预先指定的类:

 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>();
        }
    }
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,因为它重新说明了POCO和DTO之间的区别。似乎现在很多人都懒得去看这些定义,并乐于用一个术语来代替另一个术语。