我正在尝试遵循接口隔离和单一职责原则,但是我对如何将它们组合在一起感到困惑。
在这里,我有几个接口的示例,我将其拆分为更小、更定向的接口:
public interface IDataRead
{
TModel Get<TModel>(int id);
}
public interface IDataWrite
{
void Save<TModel>(TModel model);
}
public interface IDataDelete
{
void Delete<TModel>(int id);
void Delete<TModel>(TModel model);
}
我稍微简化了它(有些where
条款妨碍了可读性)。
目前我正在使用SQLite ,但是,这种模式的美妙之处在于,如果我选择不同的数据存储方法(例如Azure),它有望让我有机会更好地适应变化。
现在,我对每个接口都有一个实现,下面是每个接口的简化示例:
public class DataDeleterSQLite : IDataDelete
{
SQLiteConnection _Connection;
public DataDeleterSQLite(SQLiteConnection connection) { ... }
public void Delete<TModel>(TModel model) { ... }
}
...
public class DataReaderSQLite : IDataRead
{
SQLiteConnection _Connection;
public DataReaderSQLite(SQLiteConnection connection) { ... }
public TModel Get<TModel>(int id) { ... }
}
// You get the idea.
现在,我在将它们整合在一起时遇到了问题,我确定总体思路是创建一个Database
使用接口而不是类(真正的实现)的类。所以,我想出了这样的事情:
public class Database
{
IDataDelete _Deleter;
...
//Injecting the interfaces to make use of Dependency Injection.
public Database(IDataRead reader, IDataWrite writer, IDataDelete deleter) { ... }
}
这里的问题是我应该如何向客户端公开IDataRead
、IDataWrite
和IDataDelete
接口?我应该重写重定向到接口的方法吗?像这样:
//This feels like I'm just repeating a load of work.
public void Delete<TModel>(TModel model)
{
_Deleter.Delete<TModel>(model);
}
突出显示我的评论,这看起来有点愚蠢,我费了很多力气将这些类分成很好的、分离的实现,现在我将它们全部重新组合到一个大类中。
我可以将接口公开为属性,如下所示:
public IDataDelete Deleter { get; private set; }
这感觉好一点,但是,不应该期望客户端必须经历决定他们需要使用哪个接口的麻烦。
我完全错过了这里的重点吗?帮助!