Habréに関する私の最初の投稿では、次の対話が行われました。
A.ストアドプロシージャを介してのみデータベースに直接アクセスできず、特定のクラスがストアドプロシージャの呼び出しを担当することが重要です。
B.「ストアドプロシージャのみ」-NoSQL製品に何と言いますか?
さらに重視されたのは、SQL vs. NoSQL しかし、基本は失われました。 データベースを使用した作業は、プロジェクト全体に呼び出しコードを散らばらせないように、特別に洗練されたクラスで編成する必要があります 。
NoSQLは、リレーショナルデータベースと真剣に競うには若すぎる製品であると今でも信じています。 しかし、NoSQLにはわずかに異なるニッチがあります。 大容量のないプロジェクトにデータストレージが必要でした。 それで、 MongoDBを試してみることにしました。 (私はむしろOracle NoSQL Databaseで作業したいのですが、C#でこれを使用する方法を見つけることができませんでした)。
まあ、一般的に、すべてがデータベースにオブジェクトを保存するのに十分です、それは非常に少しする必要があることが判明しました:
var collection = db。 GetCollection < StrategiesData > ( ) ;
コレクション。 保存 ( argObject ) ;
StrategiesDataは私のオブジェクトのタイプであり、argObjectは実際には私のオブジェクトです。 しかし、そのようなスタイルは、プロジェクト全体でデータベースへの魅力を分散させるだけです。 オブジェクトのタイプを明らかに示す
< StrategiesData >
さて、マッピングの残りの部分(更新。別のオプションがあることがわかりました-一般化されたプログラミングのフレームワークで考え続けるだけですが、マッピングを通してより信頼できることがわかります)。 これについてお話します。
ジェネリックメソッドを表示する
一般化されたメソッドのマッピングはそれほど単純ではないことが判明しました。 だから私は共有することを決めた、多分誰かが便利になるでしょう。
パブリック クラスデータベース
{
///現在のデータベース
IMongoDatabase db ;
public void Save ( object argObject )
{
MethodInfo MethodGetCollectionGeneric = null ;
タイプmyType = typeof ( IMongoDatabase ) ;
MethodInfo [ ] myMethod = myType。 GetMethods ( ) ;
foreach ( myMethodのMethodInfo m )
{
// GetCollectionというメソッドのみを選択します
if ( m。Name == "GetCollection" )
{
ParameterInfo [ ] pi = m。 GetParameters ( ) ;
//戻り値の型がジェネリックであるオーバーロードのみに関心があり、
//そしてメソッドにはパラメーターがありません
if ( m。ReturnType。IsGenericType && pi。Length == 0 )
{
MethodGetCollectionGeneric = m ;
休憩;
}
}
}
//オブジェクトのタイプを取得します
ObjectType = argObjectと入力します。 GetType ( ) ;
Type [ ] typeArgs = { ObjectType } ;
//汎用メソッドをインスタンス化します
MethodInfo MethodGetCollectionGenericMake = MethodGetCollectionGeneric。 MakeGenericMethod ( typeArgs ) ;
//メソッドを実行します
varコレクション= MethodGetCollectionGenericMake。 Invoke ( db、 null ) ;
コレクション。 保存 ( argObject ) ;
}
したがって、saveメソッドへのよりシンプルなアピールがあります。 そして、Databaseクラスのオブジェクトで作業するすべての場所。 また、リレーショナルデータベースを含む他のデータベースを使用する必要がある場合、Databaseクラスを設定することで簡単に変更でき、呼び出しは同じままです。 それ以外の場合は、プロジェクト全体のコードを変更する必要があります。これは深刻なプロジェクトでは自殺に似ています。 したがって、プロジェクトの特定のデータベースにアクセスするためのコードを散乱させないでください-このため、特別なクラス(またはその階層、次に「タスクマネージャー」)を割り当てる必要があります-上記の最も重要なクラスは、保存先を決定し、データベースから1つまたは別の後継者を選択します)
更新しました。
私は以下に促されました、あなたが考えるならそれはすべて簡単になります
public void Save2 < T > ( T argObject )ここでT : クラス
{
var collection = db。 GetCollection < T > ( ) ;
コレクション。 保存 ( argObject ) ;
}
しかし、彼らは「自分自身を暖めた」:)
upd 2.それでも、上記の表示なしの解決策は常に成功するとは限りません。 継承階層を使用する場合、タイプは正しく決定されません。 マッピングなしでは、タイプはオブジェクト自体ではなく、オブジェクトの親によって受け入れられます。 わかりやすくするために、少し後でコードを投稿します。
upd 3。
より詳細な記事- データベースロジック部門(試行番号2)