主なアイデアを繰り返しましょう。 データベースを扱う作業は、プロジェクト全体に呼び出しコードを分散させずに、特別にシャープ化されたクラスで編成する必要があります 。
ただし、データベースの製造元が提供するインターフェイスによってこれが妨げられる場合があります。 MongoDBに基づいて練習します。
ここでは、次の作業ロジックの実装を提案します。
データベースに格納されるすべてのクラスが継承される基本クラスが必要です。DBDataとします。 次に、ロード、保存、削除の3つのメソッドがあります。 データベースへの呼び出しは、すでにDBDataになります。
このような概念の利点は明らかです。オブジェクトのユーザーは、データベースの実装やニュアンスを考慮することなく、オブジェクトを簡単に保存および復元できます。 しかし、この道には多くの困難があります。 それらを考慮してください。
upd私のパートの議論は終わりました。 ご清聴ありがとうございましたが、議論するのに時間がかかりすぎました。
ソフトウェアの管理クラスから始めましょう。 常に何らかの形式である必要があります。 彼の責任は非常に広範囲です-彼は私たちのソフトウェアのすべてのシステムクラスを接着することに従事しています。
パブリック クラス TaskManager
{
///リンクタスクマネージャー
プライベート スタティック TaskManager thisInstance ;
/// MongoDBへのアダプターへのリンク
プライベートデータベースcurrentDatabase ;
パブリック TaskManager ( )
{
thisInstance = this ;
currentDatabase = new Database ( ) ;
currentDatabase。 RunServer ( ) ;
}
///タスクマネージャーへのポインターを取得します
public static TaskManager GetInstance ( )
{
thisInstanceを返します。
}
///データベースへのポインターを取得
パブリックデータベースGetDatabase ( )
{
return currentDatabase ;
}
public void CloseDBServer ( )
{
if ( currentDatabase != null )
{ currentDatabase。 CloseServer ( ) ; }
}
}
これで、MongoDBへの実際のアダプターです。 ここでわかるように、一般化されたメソッドのマッピングをさまざまなバリエーションで使用する必要がある場合があります。
パブリック クラスデータベース
{
/// MongoDBサーバープロセス
プライベートプロセスMongoDBProcess ;
/// MongoDBサーバーに接続する
Mongo mongo = new Mongo ( ) ;
///現在のデータベース
IMongoDatabase db ;
///サーバーを起動します
public void RunServer ( )
{ ... }
///サーバーの切断
public void CloseServer ( )
{ ... }
/// IDでオブジェクトをロードします
パブリック DBDataロード( DBData argObject )
{
MethodInfo locMethodGetCollection = GetCollection ( argObject ) ;
var locCollection = locMethodGetCollection。 Invoke ( db、 null ) ;
MethodInfo locMethodLoad = GetMethod ( locCollection、 "FindOne" 、 1 、 "Object" ) ;
オブジェクト [ ] locArgs = { new { ID = argObject。 ID } } ;
return ( DBData ) locMethodLoad。 Invoke ( locCollection、locArgs ) ;
}
///オブジェクトを保存します
public void Save ( DBData argObject )
{
MethodInfo locMethodGetCollection = GetCollection ( argObject ) ;
var locCollection = locMethodGetCollection。 Invoke ( db、 null ) ;
MethodInfo locMethodSave = GetMethod ( locCollection、 "Save" 、 1 、 "Object" ) ;
オブジェクト [ ] locArgs = { argObject } ;
locMethodSave。 Invoke ( locCollection、locArgs ) ;
}
///オブジェクトを削除
public void Delete ( DBData argObject )
{
MethodInfo locMethodGetCollection = GetCollection ( argObject ) ;
var locCollection = locMethodGetCollection。 Invoke ( db、 null ) ;
MethodInfo locMethodDelete = GetMethod ( locCollection、 "Delete" 、 1 、 "Object" ) ;
オブジェクト [ ] locArgs = { new { ID = argObject。 ID } } ;
locMethodDelete。 Invoke ( locCollection、locArgs ) ;
}
///オブジェクトの数を取得します
public long Count ( DBData argObject )
{
MethodInfo locMethodGetCollection = GetCollection ( argObject ) ;
var locCollection = locMethodGetCollection。 Invoke ( db、 null ) ;
MethodInfo locMethodCount = GetMethod ( locCollection、 "Count" ) ;
return ( long ) locMethodCount。 Invoke ( locCollection、 null ) ;
}
///すべてのオブジェクトの識別をダウンロードします
public ArrayList LoadAllID ( DBData argObject )
{
MethodInfo locMethodGeneric = InstantiationLoadAllID ( argObject ) ;
オブジェクト [ ] locArgs = { argObject } ;
return ( ArrayList ) locMethodGeneric。 呼び出し ( これ 、locArgs ) ;
}
///すべてのオブジェクトの識別をダウンロードします
Private ArrayList LoadAllID < T > ( DBData argObject )ここでT : DBData
{
ArrayList retArray = new ArrayList ( ) ;
MethodInfo locMethodGetCollection = GetCollection ( argObject ) ;
var locCollection = locMethodGetCollection。 Invoke ( db、 null ) ;
MethodInfo locMethodFindAll = GetMethod ( locCollection、 "FindAll" ) ;
ICursor < T > locCursor = locMethodFindAll。 I Cursor < T > として ( locCollection、 null ) を呼び出します。
foreach ( locCursor。DocumentsのDBData d )
{ retArray。 追加 ( d。ID ) ; }
return retArray ;
}
プライベート MethodInfo GetCollection ( オブジェクト argObject )
{
MethodInfo locMethodGetCollectionGeneric = null ;
タイプlocType = typeof ( IMongoDatabase ) ;
MethodInfo [ ] myMethod = locType。 GetMethods ( ) ;
foreach ( myMethodのMethodInfo m )
{
if ( m。Name == "GetCollection" )
{
ParameterInfo [ ] pi = m。 GetParameters ( ) ;
if ( m。ReturnType。IsGenericType && pi。Length == 0 )
{
locMethodGetCollectionGeneric = m ;
休憩;
}
}
}
locObjectType = argObjectと入力します。 GetType ( ) ;
タイプ[ ] locTypeArgs = { locObjectType } ;
locMethodGetCollectionGenericを返します。 MakeGenericMethod ( locTypeArgs ) ;
}
private MethodInfo InstantiationLoadAllID ( オブジェクト argObject )
{
MethodInfo locMethodGeneric = null ;
タイプlocType = typeof (データベース) ;
MethodInfo [ ] locMethod = locType。 GetMethods ( BindingFlags。NonPublic | BindingFlags。Instance ) ;
foreach ( locMethodのMethodInfo m )
{
if ( m。Name == "LoadAllID" )
{
ParameterInfo [ ] pi = m。 GetParameters ( ) ;
if ( m。IsGenericMethod && pi。 長さ == 1 )
{
locMethodGeneric = m ;
休憩;
}
}
}
locObjectType = argObjectと入力します。 GetType ( ) ;
タイプ[ ] locTypeArgs = { locObjectType } ;
locMethodGenericを返します。 MakeGenericMethod ( locTypeArgs ) ;
}
private MethodInfo GetMethod ( object argObject、 string argMethodName )
{
return GetMethod ( argObject、argMethodName、 0 、 null ) ;
}
private MethodInfo GetMethod ( オブジェクト argObject、 string argMethodName、 int argParamCount、 string artTypeP1 )
{
MethodInfo locMethod = null ;
locType = argObjectと入力します。 GetType ( ) ;
MethodInfo [ ] locMethods = locType。 GetMethods ( ) ;
foreach ( locMethodsのMethodInfo m )
{
if ( m。Name == argMethodName )
{
ParameterInfo [ ] pi = m。 GetParameters ( ) ;
if ( pi。 長さ == argParamCount )
{
if ( pi。 長さ == 1 )
{
if ( pi [ 0 ] 。ParameterType。Name != artTypeP1 )
{続ける; }
}
locMethod = m ;
休憩;
}
}
}
return locMethod ;
}
}
しかし、肝心なのは、誰もアダプターにアクセスしていないということです。 データベースから子孫を保存および復元できる親クラスがあります。 親クラスは次のとおりです。
パブリック クラス DBData
{
public int ID ;
パブリック DBData ( )
{ }
パブリック DBData ( int argID )
{ ID = argID ; }
プライベートデータベースGetDB ( )
{
TaskManagerを返します。 GetInstance ( ) 。 GetDatabase ( ) ;
}
パブリック intカウント( )
{
return ( int ) GetDB ( ) カウント ( これ ) ;
}
public void保存( )
{
GetDB ( ) 。 保存 ( これ ) ;
}
public void Delete ( )
{
GetDB ( ) 。 削除 ( これ ) ;
}
パブリック オブジェクトロード( )
{
GetDB ( )を 返します。 ロード ( これ ) ;
}
public ArrayList LoadAllID ( )
{
GetDB ( )を 返します。 LoadAllID ( これ ) ;
}
}
次に、相続人を作成します。
パブリック クラス StrategiesData : DBData
{
パブリック 文字列 Name ;
public StrategiesData ( ) : ベース ( )
{ }
public StrategiesData ( int argID ) : ベース ( argID )
{ }
public StrategiesData ( int argID、 string argName )
{
ID = argID ;
名前= argName ;
}
}
そして、基本的な方法でそれを操作します:
StrategiesData SD = new StrategiesData ( 1 、 "Test1" ) ;
SD。 保存 ( ) ;
など。 より簡単で楽しいものになります:)
更新しました。 ここで、いくつかの異なるデータベースがある場合に変更されるコードをスローします(ここでのインターフェイスは完全に不要であり、不要であることがわかります)
パブリック抽象クラスデータベース
{
public abstract DBData Load ( DBData argObject )
{ }
public abstract void Save ( DBData argObject )
{ }
public abstract void Delete ( DBData argObject )
{ }
}
パブリック クラス MongoDb :データベース
{
パブリック DBDataロード( DBData argObject )
{ }
public void Save ( DBData argObject )
{ }
public void Delete ( DBData argObject )
{ }
}
パブリック クラス AnyDb :データベース
{
パブリック DBDataロード( DBData argObject )
{ }
public void Save ( DBData argObject )
{ }
public void Delete ( DBData argObject )
{ }
}
パブリック クラス TaskManager
{
プライベートデータベースcurrentDatabase ;
///データベースへのポインターを取得
パブリックデータベースGetDatabase ( )
{
return currentDatabase ;
}
パブリック void ChangeDB ( )
{
if (条件がMongoの場合)
{
currentDatabase = new MongoDb ( )
}
if (その他の条件)
{
currentDatabase = new AnyDb ( )
}
}
}