Использовать внешний файл или ресурс?

Я пишу приложение С#, которое использует длинную «жестко запрограммированную» строку.

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

Я понимаю, что у меня также есть возможность встроить этот файл в качестве ресурса .resx. Это лучшая идея? Файл никогда не нужно будет локализовать.


person Yaron Naveh    schedule 11.05.2009    source источник


Ответы (6)


Если вы намерены разрешить пользователям/администраторам изменять строку, я согласен с другими ответами и предлагаю поместить ее в настройки.

Если вы не хотите, чтобы его можно было редактировать после развертывания, и он будет изменен только вами и вашими разработчиками, я бы поместил его во встроенный ресурс (обратите внимание, это не то же самое, что файл .resx). Вы бы прочитали это во время выполнения следующим образом:

Assembly assembly = Assembly.GetExecutingAssembly();
Stream stream = assembly.GetManifestResourceStream(“MyAssemblyNamespace.MyTextFile.txt”);
StreamReader reader = new StreamReader(stream);
string theText = streamReader.ReadToEnd();

Обновление: это решение легко поддерживать. Файл .txt будет просто еще одним файлом в вашем обозревателе решений в Visual Studio, и вы можете редактировать его, как и любой другой файл, держать его под контролем исходного кода, как и любой другой файл, и т. д. Чтобы превратить его во встроенный ресурс, изменив Build Действие в окне свойств на «Встроенный ресурс».

Конечным результатом является то, что ваши файлы встраиваются в вашу DLL, так что у вас есть только 1 DLL для распространения вместо DLL и папки с файлами, которые должны перемещаться вместе.

Обновление 2: что касается "производственной отладки", это очень статичное решение, и поэтому вы не сможете изменить содержимое текстового файла во время выполнения, поскольку файл запекается в DLL в время компиляции. Для чтения содержимого файла вы можете использовать такие инструменты, как reflector для просмотра встроенного ресурсы DLL. Вы также можете написать простой инструмент командной строки, который выгружает все встроенные файлы .txt из DLL в отдельные файлы, чтобы вы могли их просмотреть.

Для использования памяти нет более эффективного решения, чем «загружаю из файла в память только тогда, когда это необходимо». Вы должны решить, стоит ли улучшенная ремонтопригодность и развертывание затрат на небольшую дополнительную память, когда ваша DLL загружается в память для вашей конкретной ситуации. Тем не менее, вы не сказали, насколько велики эти файлы. Если бы они были действительно огромными (мегабайты+), я бы, вероятно, не использовал это решение и использовал бы свободные файлы на жестком диске. Если они, как правило, довольно малы (сотни килобайт), я бы не стал беспокоиться о дополнительной памяти, если только вы не находитесь в какой-то ситуации со встроенным устройством, где ОЗУ действительно мало.

person Erv Walter    schedule 11.05.2009
comment
Спасибо - посмотрите мой комментарий к другим ответам, как это решение соответствует моим требованиям? - person Yaron Naveh; 11.05.2009
comment
Спасибо, но как насчет: 1. отладки в продакшене - если у меня есть подозрения, что есть проблемы с версией, не проще ли мне открыть внешний текстовый файл? 2. Допустим, строка станет очень большой, а также будут другие строки. С вашим решением все они попадают в память при загрузке dll, а также увеличивают ее размер. Когда они являются внешним файлом, они загружаются только тогда (и если) они мне нужны. - person Yaron Naveh; 12.05.2009
comment
Ярон, Ваши возражения и опасения не кажутся обоснованными. Во-первых, вы сделали неверное предположение. Не все встроенные ресурсы в сборке загружаются в память при загрузке библиотеки DLL. Во-вторых, что вы имеете в виду под производственной отладкой. В ваших комментариях это постоянно упоминается, но вы никогда не уточняете, что это значит и почему это препятствует использованию встроенных ресурсов. Встроенный ресурс по-прежнему кажется лучшей идеей для строк разумного размера. - person Cheeso; 12.05.2009
comment
Cheeso&Erv - вы как будто противоречите загружаются ли встроенные ресурсы в память при сборке - в чем дело? - person Yaron Naveh; 12.05.2009

Почему бы не сделать его appSetting в вашем файле web/app.config?

<appSettings>
   <add key="MyLongString" value="This is a really long string value that I don't want hardcoded" />
</appSettings>

Затем в коде:

using System.Configuration;    //To ease your typing pains

var myReallyLongString = ConfigurationManager.AppSettings["MyLongString"];
person AJ.    schedule 11.05.2009
comment
Моя .dll реализует точку расширения для другого приложения, поэтому мне не разрешено изменять app.config. Даже если бы я был - app.config загружается при запуске, но моя строка кода может никогда не вызываться, поэтому я не хочу, чтобы эта строка находилась в памяти без всякой причины. Меня больше всего интересует ремонтопригодность: - Какой вариант проще всего поддерживать? - Что будет лучше, если мне понадобится отладка в продакшене? - Что, если мне понадобится еще много таких файлов? - person Yaron Naveh; 11.05.2009


Я бы поместил это в файл конфигурации приложения. .

person Andrew Hare    schedule 11.05.2009
comment
Спасибо, смотрите мои другие комментарии - я не уверен, насколько это масштабируемо. - person Yaron Naveh; 11.05.2009

Еще лучше было бы добавить файл настроек в ваш проект. Затем вы можете легко добавить параметры конфигурации через Visual Studio. См. эту ссылку.

Затем вы можете получить доступ к своей строке, используя следующее:

Settings.Default.MyString;

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

person Shane Fulmer    schedule 11.05.2009
comment
Спасибо - посмотрите мой комментарий к другим ответам, как это решение соответствует моим требованиям? - person Yaron Naveh; 11.05.2009

Чтобы более точно ответить на ваш вопрос, «лучшей практикой» будет использование файла ресурсов для любой локализуемой (даже если вы не собираетесь ее локализовать) строки в вашем приложении. Это позволяет вам получить доступ к строке во время компиляции и предотвращает ее экстернализацию в виде отдельного файла для развертывания вместе с вашим приложением.

Я предлагаю использовать этот подход; настройки аналогичны, но их не следует использовать, если только то, что вы там храните, на самом деле не представляет собой настройку. Константы — это другой вариант, но в случае длинной строки я бы держался от них подальше, просто ради удобства сопровождения.

person Ed Altorfer    schedule 11.05.2009