Я пытаюсь лучше придерживаться Принципа единой ответственности , и у меня возникают проблемы с пониманием того, как структурировать общий дизайн класса для связи с базой данных. В упрощенном варианте у меня по существу есть база данных, содержащая:
Производитель <== Зонды <==> 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);
}
Каков хороший способ реализовать это?