Разделить большой файл ресурсов на несколько файлов физически, в то время как компилятор обрабатывает его как один - PullRequest
6 голосов
/ 09 июня 2011

Можно ли физически разделить один большой файл ресурсов (.resx) на несколько файлов и при этом использовать один и тот же синтаксис для получения данных

т.е.

GlobalResource.resx

в

GlobalResource1.resx, GlobalResource2.resx, GlobalResource3.resx, ...

и все файлы будут скомпилированы в один и использовать как

Resources.GlobalResource.errParamNameReq

используя его в Asp.net 3.5. Возникают проблемы при работе с SVN, каждый раз, когда возникает конфликт при попытке проверки, я решил разбить его на несколько файлов, в то время как компилятор обрабатывает его как один.

Ответы [ 4 ]

2 голосов
/ 23 июня 2011

Каждый файл ресурса имеет файл с выделенным кодом, который используется для объявления элементов ресурса как статических свойств.Кроме того, многие средства автоматической генерации кода используются инструментами, такими как Visual Studio, для синхронизации между данными редактора xml / resource и кодом, стоящим за файлом.Разделение ресурса на несколько файлов может быть возможным, но последствия автоматической генерации кода позже могут вызвать даже больше проблем, чем простое объединение ваших изменений.Возможное решение - создать разные файлы ресурсов.Затем создайте класс, который хранит коллекцию ResourceManager экземпляра для каждого менеджера ресурсов.Примерно так:

    public class ResourceWrapper
    {
        private ICollection<ResourceManager> resourceManagers;

        public ResourceWrapper(IEnumerable<ResourceManager> managers)
        {
            resourceManagers = new List<ResourceManager>(managers);
        }

        public string GetString(string key)
        {
            foreach (var resourceManager in resourceManagers)
            {
                string res = resourceManager.GetString(key);
                if (res != null)
                {
                    return res;
                }
            }
            return null;
        }
        public string GetString(string key, CultureInfo culture)
        {
            foreach (var resourceManager in resourceManagers)
            {
                string res = resourceManager.GetString(key, culture);
                if (res != null)
                {
                    return res;
                }
            }
            return null;
        }
    }

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

0 голосов
/ 24 марта 2016

Обнаружил, что эта тема будет искать способ разделить некоторые большие текстовые ресурсы (xml-файлы с изображениями), но это мне не помогло и ничего другого не помогло с использованием поисковых терминов, таких как "split resx множественный файлx"

Во время дальнейших поисков я нашел несколько недель http://forums.asp.net/t/937583.aspx?Maximum+string+length+in+resx+file, потому что кажется, что я вообще не смог сохранить свои XML-файлы в редакторе ресурсов.

Решение состояло в том, чтобы использовать функцию «Добавить ресурс -> Добавить новый текстовый файл» в редакторе ресурсов и назвать ресурс точно так, как я бы назвал его в столбце «имя» в редакторе ресурсов. Затем я смог вставить в новый текстовый файл все, что я обычно заполнял в столбце «значение».

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

0 голосов
/ 28 июня 2011

Насколько мне известно, невозможно разделить файл ресурсов на несколько файлов, чтобы вы могли получить доступ к записям из нескольких файлов resx через один общий метод доступа, например Resources.MyAggregatedResources.Resource1. Вы наверняка знаете, что вы можете поместить столько файлов ресурсов в вашу папку App_GlobalResources, сколько захотите, и получить к ним доступ как Resources.ResourceFile1.Resource1, Resources.ResourceFile2.Resource1.

.

Все ресурсы, добавляемые в resx-файлы, автоматически сопоставляются со строго типизированными свойствами в файлах с выделенным кодом с именем resource.Designer.cs (Если вы не видите этот файл, включите опцию «Показать все файлы» в Обозреватель решений (вторая кнопка). «Отображение» реализовано как генерация кода в Visual Studio и, следовательно, не может быть изменено в вашем проекте. Вы должны реализовать свой собственный уровень абстракции над ресурсами, чтобы возвращать значения из нескольких файлов ресурсов и передавать имя ресурса в виде строки => нет способа проверить наличие орфографических ошибок или отсутствующих ресурсов во время разработки и нет IntelliSense.

Один из способов реализовать желаемую функциональность - это обновить решение до .Net 4.0 и использовать свойства dynamic, которые разрешены для выполнения. Однако вы не получите никакой поддержки IntelliSense для своих имен ресурсов, как в случае статических ресурсов ...

0 голосов
/ 28 июня 2011

Итак, вы пытаетесь разделить его, чтобы избежать конфликтов при регистрации в SVN? Если да, то вы решаете не основную причину, а ее последствия.

Если он настолько велик, что каждый раз, когда вы регистрируетесь, вы, скорее всего, столкнетесь с конфликтами, попробуйте рефакторинг их в более мелкие файлы со значимыми именами. А затем используйте решение @ Ivaylo. Каждый ресурс соответствует классу, модель сайта ASP.Net просто скрывает это от вас.

Если вы создадите файл с именем Resource1.resx в App_GlobalResources, вы получите Resources.Resource1 как класс в своем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...