Я пытаюсь следовать интерфейс сегрегация и единой ответственности принципы, однако я путаюсь о том, как свести все это вместе.интерфейс сегрегация и единый принцип ответственности беды
Здесь у меня есть пример несколько интерфейсов я разделить на более мелкие, более направленные интерфейсы:
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; }
Это чувствует себя немного лучше, однако, клиент не следует ожидать, что придется пройти через хлопот отступали который интерфейс, который им необходимо использовать.
Я полностью упустил пункт здесь? Помогите!
Я думаю, что DataReaderSQLite должен реализовать IDataRead not IDataDelete. –
@BigDaddy Мой плохой. Хорошее место. –
ИМХО, вы привносите принцип единственной ответственности в абсурдную крайность. Ответственность класса базы данных должна заключаться в выполнении операции CRUD, не нужно больше ее разбивать. –