将大型资源文件物理拆分为多个文件,而编译器将其视为一个文件

时间:2011-06-09 10:07:17

标签: .net asp.net resources

是否可以将一个大的资源(.resx)文件物理地拆分为多个文件并仍使用相同的syntex来获取数据

GlobalResource.resx

进入

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

并且所有文件将被合并为一个并使用类似

Resources.GlobalResource.errParamNameReq

在Asp.net 3.5中使用它。在svn上工作时遇到问题,每次尝试签入时都会遇到冲突,所以我想将它拆分成许多文件,而编译器将其视为一个。

4 个答案:

答案 0 :(得分:2)

每个资源文件都有一个代码隐藏文件,用于将资源项声明为静态属性。工具也使用很多自动代码生成作为Visual Studio来同步xml /资源编辑器数据和代码隐藏文件。将资源拆分为多个文件可能是可能的,但稍后自动生成代码的效果可能会导致更多问题,而不仅仅是合并您的更改。可能的解决方案是创建不同的资源文件。然后有一个类为每个资源管理器保留一个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个或更多资源文件定义相同的密钥。如果发生这种情况,代码将仅返回第一个匹配。

答案 1 :(得分:0)

所以你试图拆分它以避免在svn中签入时发生冲突?如果是,那么你不是解决根本原因而是解决它的影响。

如果它太大,每次你签到时,你都可能遇到冲突,尝试将它们重构为具有有意义名称的较小文件。然后使用@ Ivaylo的解决方案。每个资源都符合一个类,ASP.Net网站模型只是隐藏它。

如果在App_GlobalResources中创建一个名为Resource1.resx的文件,则会在您的代码隐藏中将Resources.Resource1作为一个类。

答案 2 :(得分:0)

据我所知,无法将资源文件拆分为多个文件,以便您可以通过一个公共访问器(如Resources.MyAggregatedResources.Resource1)访问多个resx文件中的条目。 您肯定知道您可以根据需要将尽可能多的资源文件放入App_GlobalResources文件夹,并将其全部作为Resources.ResourceFile1.Resource1Resources.ResourceFile2.Resource1访问。

添加到resx文件的所有资源都会自动映射到名称为resource.Designer.cs的代码隐藏文件中的强类型属性(如果您没有看到此文件,请切换“显示所有文件”选项在解决方案资源管理器(第二个按钮))。 “映射”在Visual Studio中实现为代码生成,因此无法从您的项目中进行更改。您需要在资源上方实现自己的抽象层,以从多个资源文件中返回值,并将资源名称作为string =&gt;传递。无法在设计时检查拼写错误或缺少资源,也没有智能感知。

实现所需功能的一种方法是将解决方案升级到.Net 4.0并使用已解析为运行时的dynamic属性。但是,对于资源名称,您不会获得任何IntelliSense支持,例如静态资源...

答案 3 :(得分:0)

发现这个线程将寻找一种方法来分离一些大型文本资源(带有图像的xml文件),但它对我没有帮助,也没有使用像“split resx multiple filex”这样的搜索术语。

在进一步搜索期间,我发现了几周 http://forums.asp.net/t/937583.aspx?Maximum+string+length+in+resx+file,因为我似乎无法在资源编辑器中保存我的xml文件。

解决方案是使用“添加资源 - &gt;在资源编辑器中添加“新文本文件”功能,并命名资源,就像我在资源编辑器的“名称”列中命名一样。然后我能够将所有内容粘贴到新文本文件中,我通常会将其填入“值”列。

现在每个资源都有一个文本文件,方便的差异等等。不确定它是否属于这个帖子,但我想分享。