ASP.NET Core项目中如何获取类库程序集引用用于Mapster扫描?
获取类库程序集用于Mapster Scan的几种方法
嗨,这个问题在.NET开发里挺常见的,我给你几个靠谱的解决方案,按推荐优先级排序:
1. 通过类库中的具体类型获取(最推荐)
这是最简单也最可靠的方式——只要你能访问到类库中的任意一个模型类(或者任何类型),直接通过typeof()获取它所属的程序集就行。
比如你的类库中有个UserModel,在Startup.cs里可以这么写:
using YourLibraryNamespace; // 先引用类库的命名空间 using Mapster; public void ConfigureServices(IServiceCollection services) { // 获取类库的程序集 var libraryAssembly = typeof(UserModel).Assembly; // 传入Mapster的Scan方法 TypeAdapterConfig.GlobalSettings.Scan(libraryAssembly); // 其他服务配置... }
这种方法的优势在于:只要类库被正确引用,就不会出错,而且不需要硬编码程序集名称,后续类库重命名也不用改这里的代码。
2. 通过程序集名称加载
如果你不想依赖具体类型,可以直接通过程序集的全名(或者短名称)加载。注意这里的名称是项目的AssemblyName,不是生成的dll文件名(通常两者一致,但如果手动修改过项目属性就不一样了)。
示例代码:
using System.Reflection; using Mapster; public void ConfigureServices(IServiceCollection services) { // 替换成你的类库程序集名称 var libraryAssembly = Assembly.Load("YourLibraryAssemblyName"); TypeAdapterConfig.GlobalSettings.Scan(libraryAssembly); // 其他服务配置... }
⚠️ 注意:如果后续修改了类库的程序集名称,这里必须同步更新,否则会抛出加载失败的异常,所以这种方法不如第一种灵活。
3. 扫描已加载的程序集并筛选
如果你的解决方案有多个类库需要扫描,或者不确定具体类型,可以遍历当前AppDomain中已加载的所有程序集,通过命名空间或其他条件筛选出目标程序集。
示例代码:
using System.Reflection; using System.Linq; using Mapster; public void ConfigureServices(IServiceCollection services) { // 筛选出命名空间以"YourLibraryNamespace"开头的程序集 var targetAssemblies = AppDomain.CurrentDomain.GetAssemblies() .Where(assembly => assembly.GetTypes().Any(type => type.Namespace?.StartsWith("YourLibraryNamespace") ?? false)) .ToArray(); TypeAdapterConfig.GlobalSettings.Scan(targetAssemblies); // 其他服务配置... }
这种方法适合批量处理多个类库,但要注意筛选条件要准确,避免误扫到无关的程序集。
内容的提问来源于stack exchange,提问作者Jason




