C # определяет, какие файлы C # (.cs / poco) были изменены во время второго запуска приложения во время выполнения - PullRequest
2 голосов
/ 03 июня 2019

Я хотел бы определить, какие файлы C # (pocos) изменились при втором запуске приложения по сравнению с предыдущим.Под изменением я подразумеваю любое изменение файла, например, изменение логики внутри метода или добавление / удаление свойств / полей.Вы можете предположить, что имя файла остается прежним.Проверка журналов / изменений git выходит за рамки этой проблемы.

Потенциальные решения, о которых я могу подумать, - вести учет хеша в базе данных.Я могу вычислить хеш файла или вычислить хеш экземпляра объекта poco.Вычисление хеша файла даст мне уникальный хеш, но во время выполнения все файлы .cs скомпилированы в dll, поэтому это может быть невозможно сделать в рамках одного проекта, мне нужно будет запустить отдельный проект до того, какосновной проект для заполнения хешей (не идеал).Или я могу хэшировать экземпляр объекта, но я не думаю, что он учитывает изменения кода в методе / функциях poco, поскольку он только хэширует значения свойства / поля (поправьте меня здесь, если я ошибаюсь).

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

Итак, на данный момент я не уверен, какие возможные методы существуютЭта проблема.Любые указатели или советы о том, как решить эту проблему, были бы полезны.


Исходный контекст проблемы:

В системе CQRS у нас есть прогнозы и любые изменения в представлениях /проекции требуют, чтобы события воспроизводились в проекции, чтобы перестроить представление.Это может быть дорого, если база данных событий велика.Поэтому я создал несколько инструментов, позволяющих перестраивать все все виды / проекции для запуска приложений в разработке и на производстве, а также возможность по желанию воссоздать некоторые виды для скорости, которая изменилась во время спринта.Чтобы по желанию воссоздать представления, мы должны выяснить, какие представления изменились во время спринта, и передать его как переменную среды, поэтому единственные правильные представления должны быть перестроены для ускорения времени запуска приложения.Это ручной процесс, и человеческая ошибка может возникнуть легко, когда мы можем пропустить представление, которое могло измениться.Я хотел бы автоматически определять представления, которые изменились во время спринта, при запуске приложения, проверяя файлы, которые были изменены, и использовать этот список изменений для перестройки представлений.

Заранее спасибо за помощь:)

Ответы [ 3 ]

1 голос
/ 03 июня 2019

Использовать систему контроля версий. Сегодня Git - это то, чем пользуется большинство людей. Visual Studio поддерживает Git (см. Контроль версий в Visual Studio ). Лично я предпочитаю использовать Git Extensions для Visual Studio .

Эти расширения имеют браузер, который позволяет сравнивать коммиты. Все изменения кода выделены. Старый код красный, новый код зеленый.


UPDATE

Вы можете создать хеш-код из свойств в типе, чтобы увидеть, изменились ли они:

public static int GetPropertyHash(Type type) {
    int hash = 237463;
    foreach (PropertyInfo prop in type.GetProperties()) {
        unchecked {
            hash = hash * 17 + prop.Name.GetHashCode();
            hash = hash * 17 + prop.PropertyType.FullName.GetHashCode();
        }
    }
    return hash;
}

Если этого недостаточно, то создайте отдельное приложение, которое вычисляет хэш соответствующих файлов кода и сохраняет результат в виде файла кода C # в этом проекте. Или используйте шаблон T4 внутри проекта для создания этого файла. Сгенерированный файл может выглядеть примерно так:

public static class SouceCode
{
    public static Dictionary<string, int> Hash => new Dictionary<string, int> {
        ["MyView1.cs"] = 1382683,
        ["MyPoco.cs"] = -598674579,
    };
}
0 голосов
/ 05 июня 2019

Получение стабильного хэша является частью решения, уже описанного в других ответах.

Если вам нужен доступ к файлам C # во время выполнения, вам нужно будет как-то скопировать их во время сборки.В файле проекта вы можете либо внедрить файлы, а затем извлечь их из манифеста сборки, либо скопировать файлы в bin / и прочитать их с диска.

0 голосов
/ 03 июня 2019

Хеш отличается, только если вы используете встроенный метод String.GetHashCode (унаследованный от Object).Если вы используете свой собственный метод хеширования (более сложный) или реализацию, такую ​​как HashCode (в .NET Core), вы получите то, что хотите.

...