2

私はAPIが初めてです。次のように「コンテキスト」オブジェクトを介してオブジェクトを構築する必要があるようです。

ServerRuntime cayenneRuntime = new ServerRuntime("cayenne-project.xml");
context = cayenneRuntime.newContext() 
...
MyEntity entity=context.newObject(MyEntity.class);

通常の new() 方法で Java オブジェクトを作成するだけではなく、次のようにします。

MyEntity entity=new MyEntity();

しかし、次のような「MyEntity」クラスのコンストラクターを作成したいと思います。

public MyEntity(String inputFile) {
...
do setters based on information derived from inputFile (size, time created etc).
...

どうすればこれを達成できますか-理想的には、オブジェクトをインスタンス化して設定を実行するために「ラッパー」クラスを別の場所に置くのではなく、クラス MyEntity 自体にロジックを保持したいのです....「ヘルパー」を持つことができると思います以前にインスタンス化されたインスタンスの設定だけのメソッド...しかし、ここで欠けているイディオムはありますか...?

4

1 に答える 1

2

'context.newObject(..)' を介してオブジェクトを作成することについて正しく理解しました。これが最善の方法であり、問​​題を回避できます。それでも、実際には独自のコンストラクターを持つことができます (フレームワークが使用するデフォルトのコンストラクターも保持している場合)。

public MyEntity(String inputFile) {
   ...
}

public MyEntity() {
}

次に、最初にオブジェクトを作成し、その後コンテキストに追加できます。

MyEntity e = new MyEntity(inputFile);
context.registerNewObject(e);

イディオムに関する限り、非常に一般的なイディオムは、永続オブジェクトでビジネス ロジックを避けることです。ORM モデルは複数のアプリケーションで再利用されることが多く、エンティティに追加した動作がどこにでも一様に適用されるわけではありません。この議論の反対側は、最も単純な方法以外は、周囲の環境の知識に依存するということです。これは、エンティティに認識させたくないものです。

代わりに、エンティティの上に位置し、すべてのビジネス ロジックを含むカスタム サービス レイヤーを記述します (多くの場合、依存性注入コンテナーと共に使用されます)。サービスはエンティティのラッパーではありません (実際、サービスはしばしばシングルトンです)。それらは、構成可能な戦略オブジェクトと考えることができます。Java の世界では、このような階層化された設計とこの種の関心の分離は非常に一般的であり、おそらく最も柔軟なアプローチです。

しかし、何かを素早くハックしたいが、それが複雑なマルチモジュール システムに成長することを想定していない場合は、エンティティでカスタム コンストラクターまたは静的ファクトリ メソッドを使用することはもちろん問題ありません。

于 2013-09-02T18:03:08.273 に答える