インターフェイスの分離と単一の責任の原則に従おうとしていますが、すべてをまとめる方法について混乱しています。
ここでは、いくつかのインターフェイスをより小さく、より直接的なインターフェイスに分割した例を示します。
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);
}
私のコメントを強調すると、これは少しばかげているように見えます。クラスを適切に分離された実装に分離するために多くの苦労をしましたが、今ではすべてを 1 つのメガクラスにまとめています。
次のように、インターフェイスをプロパティとして公開できます。
public IDataDelete Deleter { get; private set; }
これは少し気分が良くなりますが、クライアントは、使用する必要があるインターフェイスを決定するという面倒を経験する必要はありません.
ここでポイントを完全に見逃していますか?ヘルプ!