私は現在、クライアントのさまざまなWebプロジェクトのフレームワークとして機能する非常に単純なORMツールの作成に取り組んでいます。ほとんどのプロジェクトは内部的なものであり、大量の同時実行を必要とせず、すべてがSQLServerに反します。SubSonic、NHibernate、その他の多くのオープンソースプロジェクトなどのORMツールを使用することをお勧めしますが、保守性と柔軟性の理由から、カスタムのものを作成したいと考えています。だから私の質問はこれです:このORMツールに含める必要があるいくつかの機能は何ですか?ところで、私はMyGenerationを使用してコード生成テンプレートを実行します。
10 に答える
聖なるものすべて(そして女性と子供たち)を愛するために、カスタムO/RMソリューションを使わないように説得するために可能な限りのことをしてください。完全に優れたオープンソースのホイールがすでに存在するのに、なぜ人々はホイールを再発明したいのですか?!?!
あなたのクライアントが、サポートに関する (実際のまたは想像上の) 認識のために OSS に興味がない場合、優れた GUI デザイナー ツールを備えたLightSpeedなどの最高品質の商用サードパーティ ORM を検討したことがありますか?
(出典:mindscape.co.nz)
Mindscape (LightSpeed を販売している会社) は、私が住んでいる場所の近くに拠点を置くニュージーランドの会社です。そこで何人かの開発者に会ったことがあります。彼らは信じられないほどの顧客サポートを提供していることで有名です。また、ソフトウェアを購入するとソース コードが提供されるので、好きなように微調整できます。
あなたがそうする必要があり、あなたのクライアントがばかげた金額を喜んで渡してくれる場合を除いて、あなたはおそらくあなた自身のORMをロールする必要はありません。
IMO 独自の OR/M を作成することは、これまでにない最悪の設計上の決定の 1 つです。「保守性と柔軟性」こそが、独自の OR/M を作成しない理由です。
See 25 Reasons To Write Your Own Object Relational Mapper を読んで、クライアントがNHibernate ($7.6M) やSubSonic ($1.5M)のようなものを構築するのにかかる費用を本当に支払う必要があるかどうかを確認してください。上でチャンチャンが言ったように、あなたはそれに似たものになってしまうからです.
何らかの理由でクライアント用のカスタムORMを作成することを余儀なくされている、Davy Brion(NHibernateコミッター)による投稿がたくさんあります。
彼がカバーするもののいくつかは次のとおりです。
- クラスのテーブルへのマッピング
- 箱から出してすぐに使えるCRUD機能
- 水分補給エンティティ
- セッションレベルのキャッシュ
- カスタムクエリの実行
この道をたどらなければならない場合は、間違いなくチェックする価値があります:独自のデータアクセス層シリーズを構築する
私の経験では、nHibernateスタイルを使用して、オブジェクトとデータベースの間にある種のマップを作成する必要があります。これにより、オブジェクトには、データベースでは表現しにくいものの、POCOでは表現しやすいものを含めることができます。
ジェネレーションは、スキーマに適合するクラスを提供することで開始しますが、何かを維持したり、何かをテストしたりすることを計画している場合、マッピングは後で楽しむために今は苦痛です。
Subsonicは優れたモデルであり、そのオープンソースは、生成を行う必要がある場合は、myGenerationのテンプレートを使用して機能を強化します。
ところで:私はあなたがしていることをしました、そして私は亜音速に非常に似た何かに行き着きました、そして今私のクライアントに亜音速のソースを取り、それを彼ら自身のためにフォークするようにアドバイスします。
おそらく、既存のソリューションにはまだ存在しない「機能」が必要な場合があります。たぶん、もっと簡単なものも必要です。Subsonic の 1.5 ドルは法外です。多分あなたはPOCOを使いたいと思うでしょう。たぶん、3 層のシナリオで簡単に使いたいと思うでしょう。おそらく、地球上のすべての RDBMS をサポートしたくないので、ターゲット用にコードをハードコードして最適化することができます。よりスマートなオブジェクト追跡を実装したいと思うかもしれません。たぶん、既存のオームによって下されたいくつかの設計上の決定があなたを夢中にさせます....
私自身、私自身と私が開発したカスタム orm を使用しています。じゅうたんの下にドラゴンが隠れているわけではなく、驚きのシナリオもありません。私の orm は、私がやりたいことを正確に実行します。それ以下でもそれ以上でもありません。
二次キャッシュ
エンティティ インスタンスをメモリ内に保持できます
自動ダーティチェック
オブジェクトをロードせずに、オブジェクトの変更を更新できます。
強力なクエリ言語
パワフルなカスケード操作
強力な主キー生成戦略
ORM フレームワークは、ターゲット データベースに応じて最適な主キー ジェネレーター戦略を選択します。
複合要素のサポート
イベント支援
onSave、onUpdate など
優れたドキュメントと参考書
会話状態へのサポート
よろしく、
Devart LinqConnectの使用をお試しください- すべての LINQ to SQL 機能と、最も一般的なデータベース サーバー (Oracle、MySQL、Postgre、SQL Server、および SQLite) の幅広いサポート。信じられないほどのビジュアル モデリング ツール、高度な監視ツール、高品質のサポート - 結果として、プロジェクト実行中の 3 週間で習得できました。
コンサルタントとしてのあなたの仕事 (そのように聞こえます) は、専門知識を活用して、最小限のコストと時間の投資で顧客の要望に合ったソリューションをクライアントに実装することです。
OR/M を構築して販売する場合。街づくりに行く方。他に何かが必要な場合は、既存のものを使用して仕事を完了させます。
彼らがお金を使うことを主張する場合は、既存のものを購入してください (名前は挙げませんが、無料ではない優れたものもいくつかあります)。
まだ誰も言及していません。ただし、LLBLGenを使用してください。好きなようにテンプレートをカスタマイズできます。もちろん、生成されたクラスに独自のカスタム コードを記述することもできます。それを購入。あなたは決して振り返らず、「シルキーありがとう!」と言うでしょう。それが一貫して美しく機能するとき。(私はそれを書いていませんが、私はそれが大好きです)。うまくいかない場合は、「Damn you silky!」と言うこともできます。しかし、それはありそうもないことですが、私はそれをオプションとして提供しています。
LLBLGen について私が気づいた唯一の悪い点は、その場でデータベース/サーバーを切り替えることがサポートされていることです。希望する機能がサポートされていません。つまり、取得した特定のエンティティが、切り替えた新しいデータベースに「存在しない」ことを検出する機能です。しかし、これはまれなケースです。
私は LLBLGen をお勧めします。これに出会ったとき、私は独自の OR/M を書いている最中だったからです。振り返ったことはありません。