これはちょっとばかげた疑問なので、私を許す必要があります。しかし、私は独学のプログラマーであり、良い、クリーンなアーキテクチャはしばしば私を困らせます。私はこのような質問を通して学んでいます:)NoSQLプロバイダを疎結合するためのインターフェイスの使用
私はNoSQLデータベースと対話するためにデータアクセスクラスをコード化する必要があります。問題は、後で私たちのNoSQLプラットフォームを変更することに自ら踏み込んでおきたいので、クラスと実際のデータアクセスとの間の依存関係を可能な限り緩やかにする必要があるということです。
public interface INoSql
{
string ServerLocation
{
get; set;
}
string DatabaseName
{
get; set;
}
string CollectionName
{
get; set;
}
void SaveChanges(List<NoSqlItem> nsCollection);
}
そして、このようになり、特定のデータアクセスクラスを作るために:これをスケッチ
は私の頭の中で私はこれを行うための最善の方法は、少しこのようなインタフェースを作ることだった考え出しMongoDBの
public class MongoDBConnection : IRealtimeDataAccess
{
string ServerLocation
{
get; set;
}
string DatabaseName
{
get; set;
}
string CollectionName
{
get; set;
}
public void SaveChanges(List<NoSqlItem> nsCollection)
{
MongoServer mServer = MongoServer.Create(this.ServerLocation);
MongoDatabase mDb = mServer.GetDatabase(this.DatabaseName);
MongoCollection<BsonDocument> mDbItemCollection = mDb.GetCollection<BsonDocument>(this.CollectionName);
mDbItemCollection.InsertBatch(nsCollection);
}
これまでのシンプル
- 私がしなければならないすべては、データアクセス層を使用して、任意のクラスはインターフェースのみを参照し、私たちは別のNoSQLプロバイダにスワップアウトしたい場合は、私がしなければならないすべては再であることを確認しています同じインタフェースを実装する新しいデータアクセスコンポーネントをコードする 右?まあ、それを考えて、私がそれを使いたいときに問題が起こります。
INoSql noSQLConnection = new INoSql;
インターフェイスをインスタンス化できないため、これは明らかに機能しないためです。
私のコードを素敵でゆるやかに保つための解決策は何ですか?きちんと見えますが、これは単に問題を変位ではありません
public class MyClass
{
private INoSql NoSql;
public myClass(INoSql NoSql)
{
this.NoSql = NoSql;
}
}
:1つの答えは、コンストラクタにそれを注入することであるかのように、それを中心に読んで見えますか?したがって、MyClassを作成するときにINoSqlを実装する具体的なバージョンのインスタンスを生成する必要があるため、疎結合クラスの代わりにMongoDBConnectionなどが必要になります。
明らかに私は何かを逃しましたが、何ですか?そして、この共通の問題に対する他の解決策がありますか?
乾杯、 マット
ありがとうございます - 興味深い読書。結局私は、スワップアウトが起こらないかもしれないので、私のニーズには少し余裕があり、理想的に私たちのコードに別の外部ライブラリを追加したくなかったということで、リポジトリのパターンが少し誇張されていると判断しました。私は工場の方法で必要なもののほとんどを得ました。しかし、あなたの答えは有益で、関連性があり、適切な道筋に私を置くことができます。 –
@MattThrower問題ありません。ちなみに、 "スワップアウト"のための_repository pattern_について考える必要はありません。これは絶対的抽象オブジェクトソースのための最良のソリューションの1つで、OR/Mフレームワークまたは単なるADO.NETへの依存を避け、_repository pattern_はより "ビジネスレイヤに優しい"ものです。しかし、私はあなたの実際の要件について何も知らないし、私はこの情報があなたの将来のプロジェクトでインスピレーションの良い源になることを願っています! :) –