zoukankan      html  css  js  c++  java
  • asp.net MVC中使用Autofac小结 (遇到的最傻错误: 没有为该对象定义无参数的构造函数)

    项目使用的MVC4,.net 4.5 Nuget安装最新的autofac,一直提示不支持.net 4.5。没办法了,最后用Nuget控制台安装的老版本。因为我使用的是MVC4,所以直接安装的是autofac mvc4的集成。

    命令:

    Install-Package Autofac.Mvc4
    

      安装成功。

    示例如下:

                var builder = new ContainerBuilder();
                builder.RegisterControllers(typeof(MvcApplication).Assembly);
                builder.RegisterType<Cms.BLL.SysManagementService>().As<ISysManagementService>();
                var container = builder.Build();
                DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
    

      第一行声明IoC的builder

    第二行绑定程序集中的Controllers

    第三行注入我们需要的接口对应的实现

    第四行获取IoC的容器

    第五行,利用MVC的依赖解析接口,将autofac的依赖解析传入

    需要特别注意第二行:要注册的Controllrs所在的程序集。也就说,如果Controllers是一个独立的项目,那么需要传递相应的程序集名称。示例如下:

                var builder = new ContainerBuilder();
                Assembly[] asm = GetAllAssembly("*.Controllers.dll").ToArray();
    
                builder.RegisterControllers(asm);
                builder.RegisterType<Cms.BLL.SysManagementService>().As<ISysManagementService>();
                var container = builder.Build();
                DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
    

      

      /// <summary>
            /// 获取dll中Controller程序集
            /// </summary>
            /// <param name="dllName"></param>
            /// <returns></returns>
            private static List<Assembly> GetAllAssembly(string dllName)
            {
                List<string> pluginpath = FindPlugin(dllName);
                var list = new List<Assembly>();
                foreach (string filename in pluginpath)
                {
                    try
                    {
                        string asmname = Path.GetFileNameWithoutExtension(filename);
                        if (asmname != string.Empty)
                        {
                            Assembly asm = Assembly.LoadFrom(filename);
                            list.Add(asm);
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.Write(ex.Message);
                    }
                }
                return list;
            }
    
            /// <summary>
            /// 查找dll路径
            /// </summary>
            /// <param name="dllName"></param>
            /// <returns></returns>
            private static List<string> FindPlugin(string dllName)
            {
                List<string> pluginpath = new List<string>();
    
                string path = AppDomain.CurrentDomain.BaseDirectory;
                string dir = Path.Combine(path, "bin");
                string[] dllList = Directory.GetFiles(dir, dllName);
                if (dllList.Length > 0)
                {
                    pluginpath.AddRange(dllList.Select(item => Path.Combine(dir, item.Substring(dir.Length + 1))));
                }
                return pluginpath;
            }
    

      参考:http://www.lxway.com/45068094.htm

    (这个点上坑了半天,一直报错“没有为该对象定义无参数的构造函数”,以为是autofac没入门,自己代码写错了。其实是自己分切了Controllers为独立项目,结果还一直在绑定Mvc的程序集,所以根本找不到注入)

  • 相关阅读:
    Quartz.NET-2.3.3 各种 数据库配置 类别大全
    C#获取当前路径的七种方法 【转载】
    BCB 如何拦截TAB键消息
    用union 和 struct 位域操作
    表值函数
    C#中 委托和事件的关系
    关于C++ Builder Codegurad 问题的排查。
    存储过程中使用事务的“正规”写法
    C++ 中对vector<T*> 数组的查找和排序
    BCB 中 Application->CreateForm 和 New 的一个区别
  • 原文地址:https://www.cnblogs.com/dev2007/p/5799878.html
Copyright © 2011-2022 走看看