首页 > 代码库 > 解决Autofac MVC 自动注入在 Areas拆分到不同dll下的注入失败问题
解决Autofac MVC 自动注入在 Areas拆分到不同dll下的注入失败问题
由于项目业务复杂,创建了多个Areas 并把他们放在了不同的项目中,项目使用AutoFac做的IOC
配置代码为
1 public class MvcApplication : System.Web.HttpApplication 2 { 3 protected void Application_Start() 4 { 5 //依赖注入 6 var builder = new ContainerBuilder(); 7 builder.RegisterModule(new ConfigurationSettingsReader("autofac")); 8 builder.RegisterControllers(Assembly.GetExecutingAssembly()); 9 10 var container = builder.Build(); 11 DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 12 13 AreaRegistration.RegisterAllAreas(); 14 WebApiConfig.Register(GlobalConfiguration.Configuration); 15 FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 16 RouteConfig.RegisterRoutes(RouteTable.Routes); 17 } 18 }
在 Controllers中 采用 构造函数来实现注入
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | namespace xxx.Web.Person.Controllers { /// <summary> /// 定位模块 /// </summary> public class LocationController : Controller { private ILocationService _location; public LocationController(ILocationService location) { _location = location; } } } |
启动后报错 错误信息:
[MissingMethodException: 没有为该对象定义无参数的构造函数。] System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0 System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache) +98 System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache) +241 System.Activator.CreateInstance(Type type, Boolean nonPublic) +69 System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +67
[InvalidOperationException: 尝试创建“xxx.Web.Person.Controllers.HomeController”类型的控制器时出错。请确保控制器具有无参数公共构造函数。]
通过错误信息得知 AutoFac 的RegisterControllers 只是 注入了xxx.Web的 Controllers 对于引用的 xxx.web.Person.dll 下的 Controller 没有注入。
解决方法如下:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { //依赖注入 var builder = new ContainerBuilder(); builder.RegisterModule( new ConfigurationSettingsReader( "autofac" )); builder.RegisterControllers(Assembly.GetExecutingAssembly()); //解决Areas在不同的Dll中注入问题 var assemblies = new DirectoryInfo( HttpContext.Current.Server.MapPath( "~/bin/" )) .GetFiles( "*.dll" ) .Select(r => Assembly.LoadFrom(r.FullName)).ToArray(); builder.RegisterAssemblyTypes(assemblies) .Where(r => r.BaseType == typeof (Controller)) .InstancePerHttpRequest(); var container = builder.Build(); DependencyResolver.SetResolver( new AutofacDependencyResolver(container)); AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); } } |
重新编译 运行正常。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。