Создание разных POCO из одного типа - PullRequest
2 голосов
/ 05 января 2011

Я пишу библиотеку оберток вокруг базы данных SCADA , и у меня возник небольшой вопрос о дизайне кода хиппи. Это связано с тем, как я конвертирую предоставленные объекты БД в POCO.

Я звоню в БД, используя библиотеки .NET производителей.

Когда я выполняю вызовы БД, она передает объект типа DBObject. Это может представлять что-либо в базе данных, и, как таковое, является довольно общим в информации, которую оно содержит. Любая пользовательская информация доступна из БД с помощью вызова метода DBObject.GetProperty(), который требует активного подключения к БД.

Я хочу преобразовать этот базовый DBObject во множество различных POCO, чтобы я мог передавать их через WCF и другие технологии.

В настоящее время у меня есть абстрактный базовый класс с именем ScadaObject, который имеет ряд базовых свойств, которые я хочу содержать во всех POCO, и защищенный виртуальный метод с именем InternalFromDBObject(DBObject obj), который выполняет это создание из DBObject в POCO. .

В моих производных типах я переопределяю этот метод, в качестве первого вызова вызываю base.InternalFromDBObject(obj), затем продолжаю загружать любую пользовательскую / специфическую информацию. Затем у меня в POCO есть статический метод с именем FromDBObject(), который возвращает новый экземпляр этого POCO.

Это хороший способ делать вещи? Я не очень опытен в использовании заводов, поэтому я не уверен, что они подойдут. Могу ли я использовать другие шаблоны проектирования?

1 Ответ

0 голосов
/ 07 января 2011

Вы можете создавать ваши классы poco, не производя ничего, просто добавьте в ваши poco публичные свойства, соответствующие имени и типу возвращаемого DBObject.Затем вы можете создать внешний статический класс, принимая один (и набор) DBobject и возвращая один (или набор) вашего poco.

static class ScadaTOPoco
{
   public static TPoco Create<TPoco>(DbObject sb){...}
   public static IEnumerable<TPoco> Create<TPoco>(IEnumerable<DbObject> sb){...}
}

Каждый внутренний метод может:

  • Создание poco
  • Использование отражения для получения списка открытых свойств в POCO

  • Цикл для каждого свойства и с помощью DBobject.GetProperty назначьте значение в целевом объекте poco.Обязательно конвертируйте значение, вызывая Convert.ChangeType, чтобы преобразовать его в правильный тип свойства.

Если имена свойств в scada не соответствуют соглашению об именах .NET,Вы можете встроить некоторые соглашения для отображения из Scada в .NET ...

...