Я пытаюсь лучше придерживаться принципа единой ответственности, и у меня возникают проблемы с пониманием того, как структурировать общий дизайн класса для связи с базой данных. В упрощенной версии у меня есть база данных, содержащая:
Производитель ‹== Датчики ‹==> ProbeSettings
У зонда есть производитель. Зонд имеет 1 набор настроек. Доступ к связанным объектам осуществляется по всему приложению, и, честно говоря, текущая реализация представляет собой беспорядок.
В настоящее время вот общее представление о том, как реализованы коммуникации и объекты:
public class Manufacturer
{
public int ID; // Primary key, auto-incrementing on insert
public string Name;
}
public class Probe
{
public int ID; // Primary key, auto-incrementing on insert
public int ManufacturerID;
public string Name;
public int Elements;
}
public class ProbeSettings
{
public int ProbeID; // Primary key, since it is unique.
public int RandomSetting;
}
// This class is a mess...
public static class Database
{
public static string ConnectionString;
public static void InsertManufacturer(Manufacturer manuf); // ID would be ignored here, since it's auto-incrementing.
public static void InsertProbe(Probe probe); // Again, ID generally ignored.
public static void InsertProbeSettings(ProbeSettings probeSet);
public static Manufacturer[] GetAllManufacturer();
public static Probe[] GetProbesFromManufacturer(int manufacturerID);
public static Probe[] GetProbesFromManufacturer(Manufacturer manuf);
}
Я вижу здесь много проблем.
Database
делает слишком много.- Эти объекты могут быть неизменяемыми при чтении на самом деле, единственная проблема возникает после вставки, я не уверен, какой идентификатор им был назначен, и вставленный объект теперь устарел.
- Каждый раз, когда классу нужно получить информацию из
Database
, мне пришлось бы добавить еще один метод Get для обработки определенного запроса.
Я действительно не понимаю, какой будет правильная реализация. Моя единственная реальная идея для улучшения - это какой-то базовый интерфейс для объектов базы данных, хотя это может помочь только для вставок...
public interface IDatabaseObject
{
void Insert(Database db);
bool Delete(Database db);
}
Каков хороший способ реализовать это?