这是个白痴问题,所以您必须原谅我,但是我是一个自学成才的程序员,而且良好,整洁的体系结构经常使我感到困惑。我正在学习像这样的问题:)

因此,我必须编写数据访问类以与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/

10-10 17:29
查看更多