这是个白痴问题,所以您必须原谅我,但是我是一个自学成才的程序员,而且良好,整洁的体系结构经常使我感到困惑。我正在学习像这样的问题:)
因此,我必须编写数据访问类以与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;
}
}
哪一个看起来很整洁,但这不只是解决问题的方法吗?因为您将不得不在创建MyClass时实例化实现INoSql的对象的具体版本,是的,那将必须是MongoDBConnection-或其他任何东西-而不是松散耦合的类?
显然我错过了什么,但是呢?对于这个常见问题还有其他解决方案吗?
干杯,
马特
最佳答案
您无需重新发明轮子。
以我谦卑的观点,存储库设计模式将完成这项工作:
http://martinfowler.com/eaaCatalog/repository.html
http://msdn.microsoft.com/en-us/library/ff649690.aspx
更新
我忘记了“如何获取接口实现”部分。
您将遵循存储库模式,创建接口或抽象类,然后再为NoSQL对象源实现特定的实现。
正如其他人指出的那样,为了获得正确的实现,可以使用一些框架,例如:
温莎城堡:http://www.castleproject.org/container/
Ninject:http://ninject.org/
很多其他的...
最后,我想建议您,Common Service Locator是一个好朋友,以便不直接依赖于特定的IoC / DI框架:
http://commonservicelocator.codeplex.com/
关于c# - 使用接口(interface)来松散耦合NoSQL提供程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9004731/