Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Как слепить файл-мeнеджер?

379  1 2 все
Murr патриот21.02.18 17:42
Murr
NEW 21.02.18 17:42 

Как слепить файл-менеджер?

(Запутался, попытка систематизировать задачу).


Дано:


- Шаблоны (Т4-шаблоны).

Несколько (много) ДЛЛок с шаблонами, в каждой - несколько (много) шаблонов.

Шаблоны не содержат (и абсолютно нет желания их там иметь) операций ввода/вывода.

Шаблон предоставляет относительное короткое имя файла (зависит от исходных данных) куда сбросить результат.

Шаблон может требовать записи результатов генерации в - несколько файлов (опционально), - в один файл, - не требовать записи в файл - определяется наличием имплементаций интерфейсов.

Шаблоны не содержат полных путей - для их определения используется Файловый менеджер.

Шаблоны имеют атрибуты, в которых ожидается информация для фильтрации шаблонов по применимости и порядку применения


- Атрибуты шаблонов.

Содержат статическую информацию об: применимости шаблонов, версии, приоритете.


- Исходные данные.

Исходная информация для генерации чего-то там шаблонами.

Много разного, в том числе информация об том, куда писать (более одного места) результаты генерации.


- Файловый менеджер.

Управление записью результатов генерации в файл.

Хранение путей к файлам,

функциональность построения полного имени файла.

функциональность перезаписи файлов.


- Генератор.

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

Из ДДЛок (сейчас их около 20-ти) однократно в список выбираются подходящие шаблоны, в структуру представления читаются исходные данные из файлов (почти 1000) и генератор выполняет [шаблоны] х [исходные данные] => [файлы]


Вроде с данными все.

#1 
Murr патриот21.02.18 18:34
Murr
NEW 21.02.18 18:34 
в ответ Murr 21.02.18 17:42

Теперь - проблема.


Мне очень не хочется нагружать шаблоны лишней функциональностью.

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


По применимости есть ограниченное, но - расширяемое, решение при формировании списка шаблонов.

Анализируются атрибуты и имплементация интерфейсов и по результатам принимается решение по включений в список.

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

Так что часть работы по применимости все одно ляжет либо на файловый менеджер, либо на генератор, либо будет вынесена еще куда-то.

Но это - пока не критично.


Критичная часть - функциональность записи.

Опять таки - Я не хочу иметь ее в шаблоне. Совсем не хочу. Вплоть до того, что не хочу давать шаблону возможность определять имя файла.

Хочу иметь отдельный и легко заменяемый (или - управляемый) менеджер записи (файловый менеджер), который будет записывать результат генерации в файл.

Возможно, что он так же должен будет отвечать на вопрос - а надо ли вообще генерировать данным шаблоном при этих исходных данных ?


Пока вроде как все получается сделать:

- шаблоны фильтруются изначально и отбираются те, которые требуют генерировать файл.

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


А дальше начинается непонятное: надо каким-то образом решать проблему назначения файл-менеджера для шаблона.

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

Например так:

C:\_generated\Overwritebale\Solution1\Project1\A.cs

C:\_generated\ManualCode\Solution1\Project1\A.cs

где A.cs - partial class.

Ожидается, что в МануалКоде будет добавлятся ручная часть кодирования.

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

При этом часть путей C:\_generated\Overwritebale\ и C:\_generated\ManualCode\ определены в Исходных данных,


Допустим есть два разных файл-менеджера и два шаблона и надо выбрать подходящий и связать его с шаблоном или потоком.


Как и когда это делать?

или

Куда и какую информацию добавить чтобы это было просто?


#2 
Murr патриот23.02.18 12:57
Murr
NEW 23.02.18 12:57 
в ответ Murr 21.02.18 18:34

Пока понятно, что надо полностью исключать формирование имени файла в шаблоне.

Есть параметры вызова шаблона - из них строится часть имени файла.

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

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


По назначению файл-менеджеров.

Идея такая - вместо единого списка шаблонов и выяснения в процессе генерации какой файл-менеджер должен использоваться, построить изначально словарик <манагер, список шаблонов>.

Будут проблемы с распределением рабочих потоков при переходе с одной группы на другую.


В плане посторения имени файла.

Нужно что-то, что будет извлекать из Исходных данных имена папок.

При этом построение имени - не линейное, т.е. нельзя сделать (схема "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


#3 
  beatus свой человек23.02.18 21:24
beatus
23.02.18 21:24 
в ответ Murr 23.02.18 12:57
Исходных данных имена папок.
При этом построение имени - не линейное, т.е. нельзя сделать (схема "1/1/1.Е"):
Типичная задача из раздела "большие данные". Нетривиальная то есть. Сомневаюсь, что Вам тут помогут.
#4 
AlexNek патриот23.02.18 22:42
AlexNek
NEW 23.02.18 22:42 
в ответ beatus 23.02.18 21:24

Для начала нужно осилить - что же требуется. Ну например файл менеджер у меня ассоциируется, что то типа нортон коммандера.

#5 
  beatus свой человек23.02.18 22:47
beatus
NEW 23.02.18 22:47 
в ответ AlexNek 23.02.18 22:42
А у меня ассоциируется с менеджером, типа менеджера, только папочного.
#6 
AlexNek патриот23.02.18 23:13
AlexNek
NEW 23.02.18 23:13 
в ответ beatus 23.02.18 22:47

"Как вы яхту назовете, так она и поплывет." спок

#7 
Murr патриот26.02.18 11:54
Murr
NEW 26.02.18 11:54 
в ответ beatus 23.02.18 21:24

Задача ооочень далека от "больших данных" - просто нужно элементарное управляемое формирование полного имени файла.


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

#8 
Murr патриот26.02.18 12:03
Murr
NEW 26.02.18 12:03 
в ответ AlexNek 23.02.18 22:42

что же требуется

-----

Если Я напишу PathManager тебе полегчает?

Или нужно WriteManager? спок


А что требуется Я уже осознал - на первом этапе - вынести формирование имени из шаблона.

Полностью.

Текущая проблема:

в шаблоне есть директива <#@ output extension=".dat" #>

не имею представления как програмно извлечь значение заданное для extension.

Googla & StatckOverflow говорят об других вещах.

Быстрый поиск по сорсникам Т4Тоол результата тоже не дал...

Возможно нужно Хост делать...

#9 
AlexNek патриот26.02.18 21:00
AlexNek
NEW 26.02.18 21:00 
в ответ Murr 26.02.18 12:03
Если Я напишу PathManager тебе полегчает?

По крайней мере ближе, хотя тоже не нравится. Но один фиг сейчас много времени все равно нет


"просто нужно элементарное управляемое формирование полного имени файла"


как програмно извлечь значение заданное для extension

ну так и нефиг его туды сувать. Пусть будет там где можно прочесть и шаблон пусть берёт оттуда же

#10 
Murr патриот26.02.18 22:20
Murr
NEW 26.02.18 22:20 
в ответ AlexNek 26.02.18 21:00

хотя тоже не нравится.

-----

A2734 - подойдет?


ну так и нефиг его туды сувать.

------

Я его туда и не суваю - оно там в соответствии с доками...

Вот как его оттуда достают - не понимаю - в теле класса этого кода нет...

#11 
AlexNek патриот27.02.18 22:05
AlexNek
NEW 27.02.18 22:05 
в ответ Murr 26.02.18 22:20
A2734 - подойдет?

тогда уж лучше RA-96023, хоть что то можно вспомнить спок

Хорошее имя подобрать не просто.


Так расширение нужно только как текст вбивать? Нельзя из какого файла прочитать?

#12 
Murr_0002 знакомое лицо28.02.18 10:11
Murr_0002
NEW 28.02.18 10:11 
в ответ AlexNek 27.02.18 22:05

Так расширение нужно только как текст вбивать?

------

Не понял вопроса.

Есть шаблон. В шаблоне есть директива как указано выше.

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


Нельзя из какого файла прочитать?

------

??? - шаблон транслируется в класс. В коде класса какого-либо упоминания об директиве и расширении нет.

А исходный текст шаблона по-определению не доступен...


Надо будет помучить билли на предмет этой лажи... безум

#13 
AlexNek патриот28.02.18 23:26
AlexNek
NEW 28.02.18 23:26 
в ответ Murr_0002 28.02.18 10:11
в шаблоне есть директива <#@ output extension=".dat" #>

Только так и никак иначе? Типа энтого?

<#@ output extension=GetMyExtensionDat() #>

#14 
Murr_0002 знакомое лицо01.03.18 10:00
Murr_0002
NEW 01.03.18 10:00 
в ответ AlexNek 28.02.18 23:26, Последний раз изменено 01.03.18 10:19 (Murr_0002)

Тут дока:

https://msdn.microsoft.com/en-us/library/gg586943.aspx?f=2...

Нее, там нефига нету...


Кстати, так же и по остальным директивам... полная лажа...


В MSDN Community Support предлагают... повторно парсить исходник шаблона...

#15 
AlexNek патриот02.03.18 00:18
AlexNek
NEW 02.03.18 00:18 
в ответ Murr_0002 01.03.18 10:00

А имя шаблона хоть есть? Или хоть что то для идентификации конкретного шаблона

#16 
Murr_0002 знакомое лицо02.03.18 08:51
Murr_0002
NEW 02.03.18 08:51 
в ответ AlexNek 02.03.18 00:18

Я так понимаю, что тебя интересует имя класса, сгенерированного при компиляции шаблона.

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

Но! В сгенерированном классе нет информации об директивах...

#17 
Murr_0002 знакомое лицо02.03.18 08:53
Murr_0002
NEW 02.03.18 08:53 
в ответ Murr_0002 02.03.18 08:51

П.С. То, что должен породить файл-менеджер никак не связано с именем шаблона.

#18 
AlexNek патриот02.03.18 23:08
AlexNek
NEW 02.03.18 23:08 
в ответ Murr_0002 02.03.18 08:53

меня конечный результат пока не интересует. Есть задача определить какое расширение пользует шаблон.

Если 1 шаблон=1 файл, то после первого запуска можно сделать словарь "имя"-"расширение", а после его уже пользовать

#19 
Murr_0002 знакомое лицо02.03.18 23:32
Murr_0002
NEW 02.03.18 23:32 
в ответ AlexNek 02.03.18 23:08

можно сделать словарь "имя"-"расширение"

-----

А откуда ты собираешься взять "расширение"? Среди пропертей сгенерированного класса его нет. Вообще нет в сгенерированном коде.


Если 1 шаблон=1 файл

------

Один шаблон => много файлов.

Можно все загнать в один, но мне нравится когда все отдельно...

#20 
1 2 все