Bob*_*way 1 c# architecture dependency-injection interface
这是一个愚蠢的问题,所以你必须原谅我,但我是一个自学成才的程序员,良好,干净的架构经常让我感到难过.我正在通过像这样的问题学习:)
所以我必须编写一个数据访问类来与NoSQL数据库进行交互.麻烦的是,我们希望在以后更改我们的NoSQL平台,因此我需要尽可能地在我的类和实际数据访问之间建立这种依赖关系.
在我脑海中勾勒出这一点,我认为最好的方法是使界面有点像这样:
public interface INoSql
{
string ServerLocation
{
get; set;
}
string DatabaseName
{
get; set;
}
string CollectionName
{
get; set;
}
void SaveChanges(List<NoSqlItem> nsCollection);
}
Run Code Online (Sandbox Code Playgroud)
然后为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);
}
Run Code Online (Sandbox Code Playgroud)
到目前为止很简单 - 我所要做的就是确保使用数据访问层的任何类只引用接口,然后如果我们想要换到另一个NoSQL提供者,我所要做的就是重新编写一个新的数据访问组件实现相同的界面吧?好吧,想一想,当我想使用它时问题就出现了.因为这显然不起作用:
INoSql noSQLConnection = new INoSql;
Run Code Online (Sandbox Code Playgroud)
因为您无法实例化接口.
那么保持我的代码好看和松散的解决方案是什么?阅读它看起来好像一个答案是将它注入构造函数:
public class MyClass
{
private INoSql NoSql;
public myClass(INoSql NoSql)
{
this.NoSql = NoSql;
}
}
Run Code Online (Sandbox Code Playgroud)
哪个看起来整洁,但这不仅仅取代了这个问题吗?因为当你创建MyClass时,你将不得不实例化一个实现INoSql的具体版本,是的,那将是一个MongoDBConnection - 或者其他什么 - 而不是松散耦合的类?
显然我错过了什么,但是什么?这个常见问题还有其他解决方案吗?
干杯,马特
您无需重新发明轮子.
在我的观点中,Repository设计模式将完成这项工作:
UPDATE
我忘了"如何获得接口实现"的部分.
您将遵循存储库模式,创建接口或抽象类,稍后是NoSQL对象源的特定实现.
为了获得正确的实现,正如其他人所指出的那样,你可以使用一些框架,如:
最后,我想建议您,Common Service Locator是一个好朋友,以便不直接依赖于特定的IoC/DI框架:
归档时间: |
|
查看次数: |
608 次 |
最近记录: |