Как слепить файл-мeнеджер?
Как слепить файл-менеджер?
(Запутался, попытка систематизировать задачу).
Дано:
- Шаблоны (Т4-шаблоны).
Несколько (много) ДЛЛок с шаблонами, в каждой - несколько (много) шаблонов.
Шаблоны не содержат (и абсолютно нет желания их там иметь) операций ввода/вывода.
Шаблон предоставляет относительное короткое имя файла (зависит от исходных данных) куда сбросить результат.
Шаблон может требовать записи результатов генерации в - несколько файлов (опционально), - в один файл, - не требовать записи в файл - определяется наличием имплементаций интерфейсов.
Шаблоны не содержат полных путей - для их определения используется Файловый менеджер.
Шаблоны имеют атрибуты, в которых ожидается информация для фильтрации шаблонов по применимости и порядку применения
- Атрибуты шаблонов.
Содержат статическую информацию об: применимости шаблонов, версии, приоритете.
- Исходные данные.
Исходная информация для генерации чего-то там шаблонами.
Много разного, в том числе информация об том, куда писать (более одного места) результаты генерации.
- Файловый менеджер.
Управление записью результатов генерации в файл.
Хранение путей к файлам,
функциональность построения полного имени файла.
функциональность перезаписи файлов.
- Генератор.
Обычный многопоточный исполнитель, не имеющий информации об том что именно обрабатывается. Т.е. не знающий структуру исходных данных, способ генерации и детали записи.
Из ДДЛок (сейчас их около 20-ти) однократно в список выбираются подходящие шаблоны, в структуру представления читаются исходные данные из файлов (почти 1000) и генератор выполняет [шаблоны] х [исходные данные] => [файлы]
Вроде с данными все.
Теперь - проблема.
Мне очень не хочется нагружать шаблоны лишней функциональностью.
В частности - функциональностью определения применимости шаблона в конкретном контексте и функциональностью записи/перезаписи файлов.
По применимости есть ограниченное, но - расширяемое, решение при формировании списка шаблонов.
Анализируются атрибуты и имплементация интерфейсов и по результатам принимается решение по включений в список.
Решение не полное - атрибуты не содержат, например, имен файлов - оно и понятно - это часть исходных данных и она будет доступна только после инстанцирования шаблонов.
Так что часть работы по применимости все одно ляжет либо на файловый менеджер, либо на генератор, либо будет вынесена еще куда-то.
Но это - пока не критично.
Критичная часть - функциональность записи.
Опять таки - Я не хочу иметь ее в шаблоне. Совсем не хочу. Вплоть до того, что не хочу давать шаблону возможность определять имя файла.
Хочу иметь отдельный и легко заменяемый (или - управляемый) менеджер записи (файловый менеджер), который будет записывать результат генерации в файл.
Возможно, что он так же должен будет отвечать на вопрос - а надо ли вообще генерировать данным шаблоном при этих исходных данных ?
Пока вроде как все получается сделать:
- шаблоны фильтруются изначально и отбираются те, которые требуют генерировать файл.
- параметры для шаблона вынесены из шаблона (в шаблоне только аксессоры) и могут быть расшарены с файловым менеджером.
А дальше начинается непонятное: надо каким-то образом решать проблему назначения файл-менеджера для шаблона.
Мне хочется, чтобы перезаписываемые файлы ложились в одну папку, а не перезаписываемые - в другую.
Например так:
C:\_generated\Overwritebale\Solution1\Project1\A.cs
C:\_generated\ManualCode\Solution1\Project1\A.cs
где A.cs - partial class.
Ожидается, что в МануалКоде будет добавлятся ручная часть кодирования.
В примере используются или два шаблона, или один с дополнительным параметром.
При этом часть путей C:\_generated\Overwritebale\ и C:\_generated\ManualCode\ определены в Исходных данных,
Допустим есть два разных файл-менеджера и два шаблона и надо выбрать подходящий и связать его с шаблоном или потоком.
Как и когда это делать?
или
Куда и какую информацию добавить чтобы это было просто?
Пока понятно, что надо полностью исключать формирование имени файла в шаблоне.
Есть параметры вызова шаблона - из них строится часть имени файла.
Функция, которая строит имя файла, пока еще находится в шаблоне - надо удалять и переносить менеджер файлов.
По параметрам... они тоже были в шаблоне - копировались туда перед вызовом - надо оформлять в дополнительный класс и иметь один зашаренный инстансе на поток.
По назначению файл-менеджеров.
Идея такая - вместо единого списка шаблонов и выяснения в процессе генерации какой файл-менеджер должен использоваться, построить изначально словарик <манагер, список шаблонов>.
Будут проблемы с распределением рабочих потоков при переходе с одной группы на другую.
В плане посторения имени файла.
Нужно что-то, что будет извлекать из Исходных данных имена папок.
При этом построение имени - не линейное, т.е. нельзя сделать (схема "1/1/1.Е"):
string filename = Path.Combine(
Params.Top.Parent.Parent.FolderName,
Params.Top.Parent.FolderName,
Params.Top.FolderName + "." + template.FileExtention)
где Params.Top - "верхний" элемент в списке параметров
Т.к. часто будет нужна достаточно сложная схема скажем ("-1/1/1/1.Е"?)
string filename = Path.Combine(
Params.Top.Parent.Parent.FolderName,
Params.Top.Parent.Parent.FolderName,
Params.Top.Parent.FolderName,
Params.Top.FolderName + "." + template.FileExtention)
еще - нужно комбинировать имя файла из нескольких элементов ("-1/1/1/3_2_1.Е"?)
string filename = Path.Combine(
Params.Top.Parent.Parent.FolderName,
Params.Top.Parent.Parent.FolderName,
Params.Top.Parent.FolderName,
Params.Top.Parent.Parent.FolderName + "_" + Params.Top.Parent.FolderName + "_" + Params.Top.FolderName + "." + template.FileExtention)
Видимо надо вводить понятие Схема Имени Файла
Пока можно оставить что-то простое - схема=построитель, где схема фиксированная лайбла а построитель - предопределен. (не нравится, но имплементируется легко и быстро)
Pause
Задача ооочень далека от "больших данных" - просто нужно элементарное управляемое формирование полного имени файла.
Цель поста - не получение помощи, а систематизация исходных условий - эта часть делается в перерывах между модификацией 2-х гигабайт кода - когда там тупик - отвлекаюсь на это...
что же требуется
-----
Если Я напишу PathManager тебе полегчает?
Или нужно WriteManager?
А что требуется Я уже осознал - на первом этапе - вынести формирование имени из шаблона.
Полностью.
Текущая проблема:
в шаблоне есть директива <#@ output extension=".dat" #>
не имею представления как програмно извлечь значение заданное для extension.
Googla & StatckOverflow говорят об других вещах.
Быстрый поиск по сорсникам Т4Тоол результата тоже не дал...
Возможно нужно Хост делать...
Если Я напишу PathManager тебе полегчает?
По крайней мере ближе, хотя тоже не нравится. Но один фиг сейчас много времени все равно нет
"просто нужно элементарное управляемое формирование полного имени файла"
как програмно извлечь значение заданное для extension
ну так и нефиг его туды сувать. Пусть будет там где можно прочесть и шаблон пусть берёт оттуда же
Так расширение нужно только как текст вбивать?
------
Не понял вопроса.
Есть шаблон. В шаблоне есть директива как указано выше.
Генерируемый на базе шаблона файл, по документации, должен иметь указанное в директиве расширение.
Нельзя из какого файла прочитать?
------
??? - шаблон транслируется в класс. В коде класса какого-либо упоминания об директиве и расширении нет.
А исходный текст шаблона по-определению не доступен...
Надо будет помучить билли на предмет этой лажи...
Тут дока:
https://msdn.microsoft.com/en-us/library/gg586943.aspx?f=2...
Нее, там нефига нету...
Кстати, так же и по остальным директивам... полная лажа...
В MSDN Community Support предлагают... повторно парсить исходник шаблона...
можно сделать словарь "имя"-"расширение"
-----
А откуда ты собираешься взять "расширение"? Среди пропертей сгенерированного класса его нет. Вообще нет в сгенерированном коде.
Если 1 шаблон=1 файл
------
Один шаблон => много файлов.
Можно все загнать в один, но мне нравится когда все отдельно...