データベースロジック部門(試行番号2)

最初の試みは少し面倒だったので、私はもっと一貫して書くことにしました。

主なアイデアを繰り返しましょう。 データベースを扱う作業は、プロジェクト全体に呼び出しコードを分散させずに、特別にシャープ化されたクラスで編成する必要があります

ただし、データベースの製造元が提供するインターフェイスによってこれが妨げられる場合があります。 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、 0null ;
}

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
}
}
}

Source: https://habr.com/ru/post/J144645/


All Articles