我们正在开发将以下列方式使用的产品:
>可以由多个产品使用的各种共享库.我预计这些库通常需要访问包含错误消息/异常的字符串资源.
>各种基于最终用户的应用程序,旨在作为PC上的独立应用程序运行.在部署/安装时,他们将需要支持多种语言.
>在部署时或可能在运行时(即最小或零停机时间)可能需要支持多种语言的各种网站.如果全球访问,网站可能需要同时支持多种语言.
>我们可能需要允许客户访问我们的语言文件以进行自我编辑.我们不希望允许他们访问我们的源代码(资源文件/ dll除外)以实现此目的.
>我们可能需要使用一种工具来记录我们母语中的异常(在本例中为英语),并以翻译的语言显示它们.这将有助于我们在现场调试客户解决方案.
我已经知道像RCWinTrans这样的产品,并且在VC / MFC应用程序中处理多种语言.但是,我们在这里面临的要求更为广泛,因此需要我们做出一些可能难以长期改变的前期决策,因此理想情况下我们希望现在做出最佳选择.
根据我自己的知识,我有一些问题,虽然我可能会错过一些很好的收到.net的技巧.这是我的问题:
>什么是最好的?将所有资源放在每个VS解决方案的单独DLL中,或者将资源放在每个VS项目中.我认为每个解决方案的方式更易于管理,修改和允许客户访问.每个项目的解决方案似乎更清晰,并使个别项目更具可移植性.此方法适用于我们基于共享库的解决方案以及基于最终应用程序的解决方案.
>上述解决方案是否仍然适用于网站?有没有更好的办法?这种方式需要停机吗?
>是否有可能同时加载两个单独的资源文件,即如果我们想用英语记录异常但是用翻译语言将它们备份到食物链(作为例外中的消息)?我们可以使用任何技巧来像AOP一样自动化吗?
提前致谢,
罗杰
最佳答案 您是否考虑使用像
StructureMap或
Unity这样的
Inversion of Control container?这可能允许您将默认资源与项目(IMHO最有意义)保持在一起,同时仍然允许客户在必要时在本地覆盖资源.
例如,假设您具有以下界面:
public interface IResourceSupplier
{
// Returns the localized text for a given identifier.
string Localized(string identifier);
// Returns the invariant (English) text for a given identifier.
string Invariant(string identifier);
}
使用IOC,您可以为解决方案创建集中式资源供应商,以检查用户提供的覆盖.如果未提供用户覆盖,则可以查询每个项目特定的资源提供者(在应用程序启动时检测到),直到找到返回所需资源的资源.
显然,根据您的需要,您可能需要调整性能,例如通过缓存常用资源.使用IOC确实提供了这样的优势:只要接口没有改变,插入替代实现可能是一项相对简单的任务.
这有帮助吗?