.NET环境下ASP.NET MVC应用与类库共享本地化资源方案咨询
ASP.NET MVC与类库双向共享本地化资源的解决方案
下面是几种经过验证的可行方案,适配不同场景需求:
1. 独立共享资源类库(推荐)
这是最清晰、易维护的方案,通过单独类库统一管理所有本地化资源:
- 新建类库项目(如
SharedLocalizationResources),专门存放所有.resx资源文件,比如CommonStrings.resx(默认语言)、CommonStrings.zh-CN.resx、CommonStrings.en-US.resx - 将资源文件的自定义工具设置为
ResXFileCodeGenerator,自动生成对应的资源访问类 - 在ASP.NET MVC应用和业务类库中,均添加对该共享类库的引用
- MVC应用中配置本地化时,指定使用共享资源类:
services.AddLocalization(options => options.ResourcesPath = "Resources"); services.AddMvc() .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix) .AddDataAnnotationsLocalization(options => { options.DataAnnotationLocalizerProvider = (type, factory) => factory.Create(typeof(CommonStrings)); }); - 类库中直接通过生成的资源类访问本地化文本:
var welcomeText = CommonStrings.WelcomeMessage; - 优势:资源集中管理,修改一次同步所有项目,避免重复维护。
2. 资源管理器跨项目访问
如果不想新建共享类库,可通过ResourceManager直接跨程序集访问资源:
- 确保目标项目的资源文件设置为嵌入的资源,并生成资源访问类
- MVC应用访问类库资源:直接引用类库的资源类即可,比如
ClassLibraryResources.ErrorMessage - 类库访问MVC应用资源:通过
ResourceManager指定MVC应用的资源命名空间和程序集:var rm = new ResourceManager("YourMvcApp.Resources.MvcStrings", typeof(YourMvcApp.Controllers.HomeController).Assembly); var localizedText = rm.GetString("Greeting", CultureInfo.CurrentUICulture); - 注意:避免循环引用(MVC引用类库后,类库不能直接引用MVC,只能通过ResourceManager方式访问MVC资源)
3. 依赖注入统一本地化服务
利用ASP.NET Core依赖注入,让MVC和类库共享本地化服务:
- 在MVC应用的Startup中配置本地化服务,并注册全局
IStringLocalizer:services.AddLocalization(); // 注册共享资源的本地化器 services.AddScoped<IStringLocalizer>(sp => sp.GetRequiredService<IStringLocalizerFactory>().Create(typeof(SharedStrings))); - 类库中通过构造函数注入
IStringLocalizer获取本地化文本:public class OrderService { private readonly IStringLocalizer _localizer; public OrderService(IStringLocalizer localizer) { _localizer = localizer; } public string GetOrderStatusText() { return _localizer["OrderCompleted"]; } } - 如需访问类库自身资源,MVC应用可注入
IStringLocalizer<ClassLibraryResources>:public class HomeController : Controller { private readonly IStringLocalizer<ClassLibraryResources> _libLocalizer; public HomeController(IStringLocalizer<ClassLibraryResources> libLocalizer) { _libLocalizer = libLocalizer; } public IActionResult Index() { ViewBag.LibText = _libLocalizer["LibraryWelcome"]; return View(); } }
4. 卫星程序集共享
适合需要单独部署资源包的场景:
- 将MVC和类库的资源文件编译为卫星程序集(编译后自动生成在文化目录下,如
zh-CN/YourApp.resources.dll) - 确保双方资源文件的根名称一致,或通过程序集加载方式访问对方的卫星程序集
- 注意:需保持程序集强命名和版本一致,避免加载失败。
内容的提问来源于stack exchange,提问作者Mehdi Mowlavi
相关产品推荐
相关产品推荐

