解决Autofac MVC 自动注入在 Areas拆分到不同dll下的注入失败问题
2014-05-25 10:53
369 查看
由于项目业务复杂,创建了多个Areas 并把他们放在了不同的项目中,项目使用AutoFac做的IOC
配置代码为
public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { //依赖注入 var builder = new ContainerBuilder(); builder.RegisterModule(new ConfigurationSettingsReader("autofac")); builder.RegisterControllers(Assembly.GetExecutingAssembly()); var container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); } }在 Controllers中 采用 构造函数来实现注入
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 没有注入。 解决方法如下:
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); } }重新编译 运行正常。
相关文章推荐
- “DllRegisterServer的调用失败”问题解决办法
- “DllRegisterServer的调用失败”问题解决办法
- DllRegisterServer的调用失败的问题解决方法
- 解决Spring+Quartz无法自动注入bean问题
- 解决“ .dll(或.ocx)控件已加载,但对DllregisterServer的调用失败,错误代码为0x80004005”问题的两种终极方法:SubInACL安装 VS 命令提示符
- 解决Hibernate中不同包内有形同实体导致映射失败的问题
- LInux下可以使用命令自动与网络的NTP服务器同步时间 CSDN验证码验证失败问题解决
- “DllRegisterServer的调用失败”问题解决办法
- 解决WinDbg调试Dump文件不同环境mscordacwks.dll版本问题
- 解决chrome浏览器自动翻译时总是提示“服务器出错,翻译失败”的问题
- 解决域控制器证书自动注册失败的问题
- 如何解决SoftekBarcode.dll加载失败的问题
- 解决VS2013调试ASP.NET中无法调试的问题:当前不会命中断点。在 XXXX.dll 中找到了 XXX.cs 的副本,但是当前源代码与 XXXX.dll 中内置的版本不同。
- IE7和IE8下验证码自动刷新失败的问题及解决方法
- 关于DllRegisterServer的调用失败的问题解决办法
- LInux下可以使用命令自动与网络的NTP服务器同步时间 CSDN验证码验证失败问题解决
- spring + springmvc 项目中 @Autowired 自动转载失败问题及解决
- win7/win8 64位系统注册TeeChart8.ocx 控件---以及dllregisterserver调用失败问题解决办法
- 【已解决】Xen下虚拟机执行Shutdown失败,开机自动重启虚拟机,并出现页故障问题