ASP.NET (.NET Framework)配置Ninject通过环境变量加载程序集实现AutoMapper映射
解决方案
你只需要调整程序集解析事件的注册时机,确保它在所有依赖第三方程序集的逻辑执行前生效即可,具体修改如下:
第一步:全局注册程序集解析逻辑
打开你项目的Global.asax.cs文件,在Application_Start方法的最开头添加你写的程序集解析逻辑,确保早于WebApi配置、Ninject容器初始化的执行顺序:
public class WebApiApplication : System.Web.HttpApplication { protected void Application_Start() { // 最先注册程序集解析事件 AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; // 原有启动逻辑保持不变 GlobalConfiguration.Configure(WebApiConfig.Register); // 其他原有启动逻辑,比如路由注册、过滤器注册等 } static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { var assemblyName = new System.Reflection.AssemblyName(args.Name); var basePath = Environment.GetEnvironmentVariable("PERCURSOSGP100", EnvironmentVariableTarget.Machine); // 校验环境变量是否存在,避免路径拼接错误 if (string.IsNullOrEmpty(basePath)) return null; var assemblyFullName = System.IO.Path.Combine(basePath, assemblyName.Name + ".dll"); if (System.IO.File.Exists(assemblyFullName)) return System.Reflection.Assembly.LoadFile(assemblyFullName); return null; } }
第二步:校验Ninject配置
你现有NinjectResolver里的AutoMapper注册逻辑无需修改,因为程序集解析事件已经提前注册,当AutoMapper初始化MappingProfile、需要加载第三方DLL中的BasBECliente等类型时,会自动触发你注册的解析逻辑,从环境变量指定的路径加载对应DLL。
注意事项
- 确保IIS应用池的运行身份拥有
PERCURSOSGP100对应路径的读取权限,否则会出现DLL加载失败的问题 - 你项目中引用的第三方DLL版本,要和环境变量路径下的DLL版本完全一致,避免程序集版本不匹配报错
- 不要在其他地方重复注册
AssemblyResolve事件,避免重复加载同一程序集导致类型转换异常
内容的提问来源于stack exchange,提问作者kattgsilva
相关产品推荐
相关产品推荐

