我目前正在为一个项目开发SDK,作为一项要求,我需要添加两个资源位置。一个将提供SDK lib,另一个将由消费者应用程序提供。
目前,根据文档,这是如何添加本地化:
services.AddLocalization(options => options.ResourcesPath = "Resources");
我从我的BaseStartup
类调用此方法,该类将由消费者应用程序的Startup
类继承。所以我需要能够设置SDK资源文件夹的位置以及消费者应用程序的位置。
可能是这样的:
services.AddLocalization(options =>
{
options.ResourcesPath = "SDKResources";
options.FromAssembly = sdkResourcesAssembly;
});
services.AddLocalization(options =>
{
options.ResourcesPath = "AppResources";
options.FromAssembly = appResourcesAssembly;
});
这可能吗?如果是这样,怎么样?如果没有,是否有解决方法?
在线检查甚至源代码(https://github.com/aspnet/Localization)都没有多大帮助。我唯一能想到的是使用接受程序集的IStringLocalizerFactory
和文件的名称。会有用吗?例如,添加services.AddLocalization()
然后创建一个包装类,使用IStringLocalizerFactory
创建的工厂为消费者应用程序提供字符串?
谢谢!
答案 0 :(得分:0)
我发现了两种方法,首先是从不同的程序集中添加资源:
我创建了一个基本启动类来处理包含我的资源类的所有源程序集,然后加载它们。
serviceCollection.AddLocalization();
var resourceTypes = typeof(BaseResource<>).Assembly.GetDerivedGenericTypes(typeof(BaseResource<>));
if (typeFromResourceAssembly != null)
resourceTypes.AddRange(typeFromResourceAssembly.Assembly.GetDerivedGenericTypes(typeof(BaseResource<>)));
foreach (var resourceType in resourceTypes)
{
serviceCollection.AddScoped(resourceType, resourceType);
}
return serviceCollection;
其次,通过添加不同的资源文件夹:
services.Configure<ClassLibraryLocalizationOptions>(
options => options.ResourcePaths = new Dictionary<string, string>
{
{ "ResourceClass", "ResourcesFolder" },
{ "Localization.CustomResourceClass", "Folder1/Folder2" }
}
);