Я пытаюсь найти способ написать универсальный интерфейс, который может быть реализован для нескольких хранилищ данных, в основном универсальный тип будет указывать идентификатор для данных в хранилище данных (некоторые из этих хранилищ данных сильно используютбиблиотеки, поэтому вы должны вызывать что-то вроде long createNode(Node node)
)
Например, система, которую мы используем сейчас, использует long для идентификаторов, но если мы осуществили переход (или используем оба одновременно)к чему-то вроде SQL это, скорее всего, будет GUID.Сущности в слое бизнес-логики в значительной степени установлены, представьте, что это в основном файловая система с кучей пользовательских атрибутов на узлах.
До сих пор я пробовал что-то вроде этого:
public interface DataThing<T>
{
T CreateThing(CustomEntity node);
CustomEntity GetThing(T ID);
}
public class LongDataThing : DataThing<long>
{
long CreateThing(CustomEntity node)
{
//...implement
}
CustomEntity GetThing(long ID)
{
//...implement
}
}
... сделать то же самое для GUID / Int / string ... что угодно
Тогда, когда дело доходит до создания экземпляра класса для работы в основном с шаблоном фабричного проектирования, у меня возникают проблемы.Я думал, что мог бы сделать что-то вроде:
private DataThing myDataStore;
switch(config.dbtype)
{
case "longDB":
this.myDataStore = new LongDataThing();
break;
case: "stringDB":
this.myDataStore = new StringDataThing();
break;
//...etc.
}
Но я не могу создать private DataThing myDataStore;
без указания его как long, string ... и т. Д., Что означает, что бизнес-логика уже должна знать, какой типреализуется вместо того, чтобы просто запросить у фабрики объект хранилища данных.
Так чего мне здесь не хватает?Разве вы не можете абстрагироваться от типа данных интерфейса, подобного этому, и сделать его прозрачным для вызывающей «бизнес-логики» и выяснить, какая реализация требуется из файла конфигурации или какой-либо другой внешней логики?