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

.net 将大型资源文件物理拆分为多个文件,而编译器将其视为一个文件,.net,asp.net,resources,.net,Asp.net,Resources,是否可以将一个大资源(.resx)文件物理拆分为多个文件,并且仍然使用相同的syntex来获取数据 i、 e GlobalResource.resx 进入 GlobalResource1.resx、GlobalResource2.resx、GlobalResource3.resx 所有的文件将被合并成一个文件并像 Resources.GlobalResource.errParamNameReq 在Asp.NET3.5中使用它。在处理svn时遇到问题,每次尝试签入时都会发生冲突,因此我想将其拆分

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

i、 e

GlobalResource.resx

进入

GlobalResource1.resx、GlobalResource2.resx、GlobalResource3.resx

所有的文件将被合并成一个文件并像

Resources.GlobalResource.errParamNameReq

在Asp.NET3.5中使用它。在处理svn时遇到问题,每次尝试签入时都会发生冲突,因此我想将其拆分为多个文件,而编译器将其视为一个文件。

每个资源文件都有一个代码隐藏文件,用于将资源项声明为静态属性。另外,VisualStudio等工具使用了大量自动代码生成来同步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;
        }
    }
公共类ResourceWrapper
{
私人ICollection资源经理;
公共资源包装器(IEnumerable managers)
{
ResourceManager=新列表(经理);
}
公共字符串GetString(字符串键)
{
foreach(resourceManager中的var resourceManager)
{
string res=resourceManager.GetString(键);
如果(res!=null)
{
返回res;
}
}
返回null;
}
公共字符串GetString(字符串键,CultureInfo区域性)
{
foreach(resourceManager中的var resourceManager)
{
string res=resourceManager.GetString(键,区域性);
如果(res!=null)
{
返回res;
}
}
返回null;
}
}

您只需获取所有资源并将其传递给构造函数。您可能希望在创建包装器实例后保留它,以避免为每个资源文件创建资源管理器—静态文件就可以了。上述代码的唯一问题是不能保证2个或更多资源文件定义相同的密钥。如果发生这种情况,代码将只返回第一个匹配项。

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

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


如果在App_GlobalResources中创建名为Resource1.resx的文件,则可以在codebehind中将Resources.Resource1作为类获取。

据我所知,无法将资源文件拆分为多个文件,以便您可以通过一个公共访问器访问多个resx文件中的条目,比如
Resources.MyAggregatedResources.Resource1
。 您肯定知道这样一个事实:您可以将任意多个资源文件放入
App\u GlobalResources
文件夹中,并将它们作为
Resources.ResourceFile1.Resource1
Resources.ResourceFile2.Resource1
访问

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


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

发现此线程将寻找一种方法来分离一些大型文本资源(带有图像的xml文件),但它没有帮助我,也没有使用诸如“split resx multiple filex”之类的搜索词进行任何操作

经过几周的进一步搜索,我发现 ,因为我似乎根本无法在资源编辑器中保存xml文件

解决方案是在资源编辑器中使用“添加资源–>添加新文本文件”功能,并像在资源编辑器的“名称”栏中那样对资源进行命名。然后我可以将所有内容粘贴到新的文本文件中,我通常会在“value”列中填写这些内容


现在,我每个资源都有一个文本文件,handy Diff等。我不确定它是否完全属于此线程,但我还是想共享它。

为什么在您尝试签入它时会有冲突?签入它会花费很多时间吗?使用asp.net网站项目,App_GlobalResources文件夹中只有resx文件,没有与此相关的类文件