-1

POCO クラスにコンストラクターまたはその他の非データベース アクセス メソッドを使用しても問題ありませんか。たとえば、ビューモデルをコントローラーに渡すとき。

コントローラ:

public ActionResult SomeMethod(SomeViewModel model) 
{
    var entity = new SomePocoClasse(model);
    // ... then save entity to database

    return SomeActionResult
}

実在物:

public SomeClass() {}

public SomeClass(SomeViewModel model) 
{
    // create itself based on values in model
}

public void Update(SomeViewModel model)
{
    // Update itself base on values in model
}

最初のエンティティ コンストラクタは、エンティティ フレームワークまたは通常の作成用です。

var entity = new entity 
{
    // set up properties
};

2 つ目は、SomeViewModel からの作成用です。

var entity = new entity(SomeViewModel);

メソッドは SomeViewModel から自分自身を更新するためのものです

var entity = SomeIRepository.Get(id);
entity.Update(SomeViewModel);

または、他の場所に行くべき上記の悪い習慣です。

4

1 に答える 1

2

はいといいえ。一般に、POCO にコンストラクターを使用することは、必ずしも悪い習慣ではありません。それを望む、または必要とする理由はいくらでもあります。ただし、パラメーターなしのコンストラクターも維持する必要があります。そうしないと、POCO クラスを適切に初期化する方法がわからない EF などの問題が発生します。

とはいえ、ここで行っていることは良い習慣ではありません。大量のコードを提供していませんが、ビューモデルを POCO コンストラクターに渡して、POCO のプロパティにそれらの値を設定しているようです。むしろ、データベースから新しいエンティティを取得し、ビュー モデルの関連するプロパティをそのエンティティ インスタンスにマッピングする必要があります。新しいエンティティを作成するときだけ、あなたがしていることはうまくいくと思いましたが、それは、作成しているか編集しているかに応じて、POCO クラスに値を設定する 2 つの別々の方法があることを意味します。これにより複雑さが増し、複雑さはメンテナンス コストの増加を意味します。

代わりに、AutoMapper などのライブラリを使用するか、マッピングを処理するユーティリティ クラスを作成する必要があります。

public static class SomePocoMapper
{
    public static SomePoco Map(SomeViewModel model)
    {
        return Map(model, null);
    }

    public static SomePoco Map(SomeViewModel model, SomePoco entity)
    {
        entity = entity ?? new SomePoco();
        // map over property values;
        return entity;
    }
}

次に、作成アクションで:

var entity = SomePocoMapper.Map(model);

そして編集アクションで:

var entity = // get entity from database
SomePocoMapper.Map(model, entity);
于 2016-12-02T16:30:05.533 に答える