Какая-то аннотация для POCO - PullRequest
0 голосов
/ 19 марта 2012

В рамках моего более крупного проекта я разрабатываю синтаксический анализатор для Интернета, который в соответствии с предопределенными правилами будет получать данные с веб-страниц и помещать их в объекты.Я пишу на C #, используя .Net 4.0 и SQL Server 2008.

Идея такова:

Предположим, у меня есть объект Car { Power, Weight, Price } (который является POCO, используемым в EF для хранения данных),Я создаю правила для своего парсера, поэтому при сканировании какого-либо сайта он попытается заполнить свойства объекта.

Например: Car { Power=100Hp, Weight=1000kg, Price=7000$ } Все это работает.Но поскольку все сайты разные и даже на одном сайте данные могут быть структурированы по-разному, мне нужен какой-то способ проверки моих правил синтаксического анализа.

Я хочу создать приложение для тестирования, которое будет:

  1. Взять список URL-адресов товаров.Загрузите их, сохраните в каком-либо формате.
  2. Я вручную проверю, какие свойства элементов анализируются правильно, и помечу их как правильные.
  3. Запустит тестер в режиме проверки.Где он должен снова загрузить все данные из сети и сравнить их с данными, которые я пометил как правильные.

Таким образом, у меня могут быть какие-то юнит-тесты для правил, пока я их улучшаю.

Теперь встает актуальный вопрос: для того, чтобы реализовать все это, я не хочу изменять свои сущности, я хотел бы иметь какую-то обертку вроде:

Car { 
   Power { Value, IsCorrect}, 
   Weight {Value, IsCorrect}, 
   Price {Value, IsCorrect}}

Так что все мои существующиекод может работать как прежде, и только мой тестовый код может использовать эту информацию аннотации.Также, конечно, я хочу, чтобы эта информация была сериализуемой, либо для базы данных, либо для XML.

В настоящее время моя общая идея состоит в том, чтобы сериализовать Car в Xml, а затем вручную добавить свойства аннотации и проверить их.Под ручным здесь я подразумеваю использование методов XmlDocument.Это должно сработать, но я не пришел к выводу о том, как хранить аннотации и получать к ним доступ в памяти (мне не нравится идея выполнять всю проверку через XmlDocument)

Возможно, на каком-то динамическом языке,как javascript, я бы просто добавил аннотации, подобные этой

Car c = { Power = 1, Weight=2 ...};
c["Power_IsCorrect"] = true;
c["Weight_IsCorrect"] = true;
///... etc

Я не могу представить что-то подобное в C #: (

1 Ответ

1 голос
/ 19 марта 2012

Вы можете создать небольшой класс-обертку, который использует строки для идентификации свойств или деревьев выражений.

Пример для класса, который использует строки:

class AnnotatedObject<T>
{
    private Dictionary<string, bool> _propertyMap =
        new Dictionary<string, bool>();

    public AnnotatedObject(T originalObject) { OriginalObject = originalObject; }

    public T OriginalObject { get; private set; }
    public bool IsCorrect[string property]
    {
        get
        {
            bool result;
            if(!_propertyMap.TryGetValue(property, out result))
                result = false;
            return result;
        }
        set { _propertyMap[property] = value; }
    }
}

Вы можете использовать его так:

var annotatedCar = new AnnotatedObject<Car>(car);
annotatedCar.IsCorrect["Power"] = true;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...