是否可以将一个大的资源(.resx)文件物理地拆分为多个文件并仍使用相同的syntex来获取数据
即
GlobalResource.resx
进入
GlobalResource1.resx,GlobalResource2.resx,GlobalResource3.resx,...
并且所有文件将被合并为一个并使用类似
Resources.GlobalResource.errParamNameReq
在Asp.net 3.5中使用它。在svn上工作时遇到问题,每次尝试签入时都会遇到冲突,所以我想将它拆分成许多文件,而编译器将其视为一个。
答案 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.Resource1
,Resources.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;在资源编辑器中添加“新文本文件”功能,并命名资源,就像我在资源编辑器的“名称”列中命名一样。然后我能够将所有内容粘贴到新文本文件中,我通常会将其填入“值”列。
现在每个资源都有一个文本文件,方便的差异等等。不确定它是否属于这个帖子,但我想分享。