博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解决Autofac MVC 自动注入在 Areas拆分到不同dll下的注入失败问题
阅读量:6218 次
发布时间:2019-06-21

本文共 3226 字,大约阅读时间需要 10 分钟。

由于项目业务复杂,创建了多个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中 采用 构造函数来实现注入

namespace xxx.Web.Person.Controllers{    ///     /// 定位模块    ///     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 没有注入。 解决方法如下:
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);        }    }

  重新编译  运行正常。

 

转载于:https://www.cnblogs.com/xiaokangufo/p/3750894.html

你可能感兴趣的文章
FastCgi与PHP-fpm之间是个什么样的关系
查看>>
对Navicat for MySQL 中1045错误的解决办法
查看>>
log日志
查看>>
使用CSS渐变
查看>>
ASP.NET ViewState详解
查看>>
阿里 Maven仓库
查看>>
Python学习之==>正则表达式
查看>>
My97DatePicker时间控件使用方法
查看>>
c# 线程基础
查看>>
各类杀软对应的进程名
查看>>
推荐一些socket工具,TCP、UDP调试、抓包工具 (转载)
查看>>
iOS 7 & iOS 6适配问题
查看>>
《C++数据结构-快速拾遗》 手写链表
查看>>
hdu2068 RPG的错排 组合数/递推
查看>>
jar 文件不能运行
查看>>
小工具?不,这是小工具的集合!
查看>>
CAVLC算法解析
查看>>
12 在微服务集群中使用Zuul
查看>>
Python登陆人人网
查看>>
Exchange 2010 打补丁的顺序
查看>>