2

この質問は、私が取り組んでいるJavaプロジェクトに関するものでしたが、C#にも当てはまる可能性があります。

とにかく、私はMVCWebプロジェクトを持っています。その中に、データ用の3つの「レイヤー」があります。

com.example.model.dao
com.example.model.entities
com.example.model.service

daoの低レベルのデータベースクラスもそうです。Hibernateラッパーなど entitiesは、私のPOJOでserviceあり、私のビジネスロジックです。

ここで、それらのPOJOの1つがであるとしましょうUser。Userでは、と呼ばれるデータベーステーブルにマップされますusers。このテーブル(およびPOJO)には、2つのフィールドとがfirstnameありlastnameます。OK、それで、名前と名前を単純に連結するgetFullNameというメソッドをどこかに置きたいと思います。

では、この方法はどこに行けばよいのでしょうか。POJO自体に入れることを考えました。ただし、ツールを使用してデータベースからPOJOを生成することがあるため、カスタムロジックが上書きされる可能性があります。そして、これはとにかくビジネスプロセスですか?

サービスの実装に含める必要がありますか?

あなたの提案をありがとう。

4

5 に答える 5

2

C#では、部分クラスを使用します(これにより、「生成されたクラス」の問題が解決されます。もちろん、生成されたPOCOは部分的である必要があります)

public partial class User {
   public string GetFullName() {
     return string.Format("{0} {1}", FirstName, LastName);
   }
}

部分的なクラスが存在しないため、Javaでは機能しないソリューション!

したがって、「最も適切な」ソリューションは、2つの言語で同じではない可能性があります。

于 2012-09-12T14:59:01.357 に答える
1

ビジネス層にカスタムビジネスロジックを実装する必要があります。この場合、POJOを生成するときに、サービスレイヤーに配置する必要があります。

于 2012-09-12T15:00:20.103 に答える
0

私は通常、そのタイプのメソッドをエンティティ自体に配置しますが、上書きされる可能性があると言うので、エンティティのヘルパークラスを使用できます。

class UserHelper {
  String getFullName() {
    ...
  } 
  ... more methods
}

個人のフルネームをビジネスプロセスとして取得することはわかりません。

于 2012-09-12T14:58:49.533 に答える
0

このあたりの開発者の多くと同じように、Imはデザインパターン、ベストプラクティス、および標準に非常に厳格ですが...

...ルールには常に例外があり、より正確にはガイドラインに例外があります。

開発者は通常、その種の関数をロジックレイヤーに配置しますが、場合によっては、プレーンオールド(Java / C#/ ...)オブジェクトに追加しても問題ありません。

擬似コード:

class DataAccessLayerPerson
{
  public FirstName
  {
    get; set;
  }

  public MiddleName
  {
    get; set;
  }

  public LastName
  {
    get; set;
  }

  public getFullName()
  {
     return FirstName + MiddleName + LastName;
  }
}

class BusinessLogicLayerPerson
{
  public FirstName
  {
    get; set;
  }

  public MiddleName
  {
    get; set;
  }

  public LastName
  {
    get; set;
  }

  public FullName
  {
    get; set;
  }
}

同様の一般的なケースは、テーブルにブール値として概念的に使用されるフィールドがあるが、プログラムで「f」または「t」を格納するchar(1)として、または整数またはビットとして使用され、プログラミングでそれらを使用する必要がある場合です。ブール値として。

そのため、データアクセス層でいくつかのロジックを使用し、ブール値としてこれらのフィールドの読み取りと書き込みを行います。

乾杯。

于 2012-09-12T15:23:12.920 に答える
0

私たちのプロジェクトでも同じ問題があったので、次のようにしました。

@MappedSuperclass
public class UserDTO {
   // this is the class which can be regenerated by code generator, and only contains database fields
}

@Entity
public class User extends UserDTO {
   // this is the class containing more business methods, methods do things that are not part of the database columns
}
于 2012-09-12T16:13:14.363 に答える