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オブジェクトは次のように強制されない可能性があると言えます。

I.事前に指定されたクラスを拡張します。

public class MyClass : AnyFramework.ObjectBase {...

II。事前に指定されたインターフェイスを実装する

public class MyClass : AnyFramework.IHaveDependency {...

III。事前に指定された属性を含む

[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 に答える