我问了一个question https://stackoverflow.com/questions/1504363/how-should-i-localise-pluggable-components以前只有一个答案。我现在已经花了一些时间来研究这个并制定了计划,但希望得到一些反馈来确定这是否是一个好主意。
问题:
我想要一个具有名称(不变,用于标识组件)的组件在使用它的应用程序中本地化其名称,而不用 DisplayName 属性污染组件的模型。该组件可能存在于单独的 dll 中并在运行时动态加载。
我的感觉是组件 dll 应该负责提供本地化名称(这似乎是很好的封装),但是使用该组件的应用程序应该负责获取/使用本地化名称(事实上,该组件具有不同的名称)显示目的不是组件的问题,而是使用该组件的“视图”的问题)
解决方案:
将一个资源添加到组件 dll 中,其名称与组件类所在的文件相同。将一个字符串添加到资源中,其键是组件的名称。
在应用程序中获取本地化名称,如下所示:
ExternalObject obj = GetExternalObject ();
ResourceManager manager = new ResourceManager (obj.GetType ());
string localisedName= manager.GetString (obj.Name);
该代码可能会封装在 Localiser 类中,但传达了要点。这似乎可行,但这是一个好主意,还是有更好/更标准的方法来做到这一点?
编辑:我应该指出,我对该解决方案不确定的一件事是资源必须位于与类所在文件同名的 .resx 文件中。这使得它可以工作,因为可以从类型名称来识别资源文件。这与表单本地化似乎起作用相同,并且使 Visual Studio 将 .resx 作为 .cs 文件的“子组件”,这一切看起来都很好。但是,如果我尝试编辑此文件,Visual Studio 会发出警告(关于编辑属于另一个项目项的资源),这让我认为也许还有其他方法可以做到这一点。
我认为你的想法是正确的,但有更好的方法来实现这一点。
据推测,您有一个可插入组件实现的接口。比如说,IPluggable:
interface IPluggable {
...
string LocalizedName {get;}
...
}
从您的主二进制文件中,加载可插入程序集并使用反射创建 IPluggable 实例(我认为这就是GetExternalObject()
你有的方法),然后使用访问本地化名称LocalizedName
财产。InsideIPluggable 实现,创建一个ResourceManager
并访问LocalizedName
来自该可插拔组件的 resx。
您所做的就是在可插拔程序集中很好地封装行为 - 它负责为您提供本地化名称,但是它选择这样做,而不需要您的 man 程序假设ResourceManager
可以创建访问本地化名称。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)