webapi 使用autofac_webapi中使用autofac - CSDN
精华内容
参与话题
  • Web API 集成提供了controllers, model binders和 action filters的依赖注入. 它同样添加了 每个请求生命周期支持.

    在这里插入图片描述
    控制器:构造函数注入不同类型的实例赋值给其实现的接口类型
    在这里插入图片描述

      public class UserController : ApiController
        {
            private IPersons person;//接收注入的类型实例
    
            public UserController(UCer ucer)//构造函数注入
            {
                this.person = ucer;
            }
            // GET: api/User
            public string Get()
            {
                return person.Say();
            }
      	}
    

    Global文件(配置):

     public class WebApiApplication : System.Web.HttpApplication
        {
            protected void Application_Start()
            {
             
                
                //--导入AutoFac-AutoFac.WebAPI2
                //创建容器
                var builder = new ContainerBuilder();
                // Get your HttpConfiguration.
                var config = GlobalConfiguration.Configuration;
                //加载程序集类型,自动注册其下面的所有类型(中英文)
                builder.RegisterAssemblyTypes(Assembly.Load("Chinaese"));
                //加载本程序集下的所有控制器类型
                builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
                //编译一下
                var container = builder.Build();
                //WebApi整个的解析依赖交给AutoFac    //默认构造函数注入
                config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
                //把所有类型都注册到AutoFac容器里,最后把整个项目的实例创建和解析依赖交给AutuFac,
                //这样AutoFac在创建控制器实例的时候根据参数类型(不注入的走无参构造函数),去容器取对应实例进行注入
    
    
    
    
    
                AreaRegistration.RegisterAllAreas();
                GlobalConfiguration.Configure(WebApiConfig.Register);
                FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
                RouteConfig.RegisterRoutes(RouteTable.Routes);
                BundleConfig.RegisterBundles(BundleTable.Bundles);
    
    
            }
        }
    

    在这里插入图片描述
    在这里插入图片描述
    B站资源
    B站视频简单教程>>>

    如果程序中出现请确保控制器具有无参构造函数!!那就是容器内没有其构造函数参数指定的类型资源(需要注入的资源类型没有被注册到容器内)。


    2020-04-05 16:35

    展开全文
  • 一、前言 只要你是.NETer你一定IOC,IOC里面你也会一定知道Autofac,上次说了在MVC5...在WebAPI2使用Autofac注入的时候大多数人会出现如下问题: 未能加载文件或程序集“System.Web.Http, Version=5.0.0.0, Cult...

    一、前言

    只要你是.NETer你一定IOC,IOC里面你也会一定知道Autofac,上次说了在MVC5实现属性注入,今天实现在WebApi2实现属性注入,顺便说一下autofac的程序集的注入方式,都会在后面的代码里面有提现

    在WebAPI2使用Autofac注入的时候大多数人会出现如下问题:

    未能加载文件或程序集“System.Web.Http, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)

    截图如下:

    这个是Autofac强依赖造成的,比较坑的。解决办法如下。

    Nuget添加Microsoft.AspNet.WebApi

    或通过NuGet 程序包管理器控制台添加:

    Install-Package Microsoft.AspNet.WebApi

    Update-Package Microsoft.AspNet.WebApi -reinstall(存在)

    原因:我们新建的是一个空的MVC项目,缺少引用

     

    先上个结构图,结构图只是为了说明webAPI如何简单使用Autofac实现属性注入。

    属性注入存在安全隐患,官方建议使用构造函数注入。

    下面说下具体实现:

    二、代码实现

    1、新建一个WebAPI.Entity类库,新建一个Person.cs类

        public class Person
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public int Age { get; set; }
            public string Address { get; set; }
        }

    2、新建WebAPI.IRepository类库,新建一个IPersonRepository类

        public interface IPersonRepository
        {
            List<Person> GetAll();
            Person Get(int id);
            Person Add(Person item);
            bool Update(Person item);
            bool Delete(int id);
        }

    3、新建WebAPI.Repository类库,新建一个PersonRepository类实现IPersonRepository接口

    public class PersonRepository : IPersonRepository
        {
            List<Person> person = new List<Person>();
    
            public PersonRepository()
            {
                Add(new Person { Id = 1, Name = "joye.net1", Age = 18, Address = "中国上海" });
                Add(new Person { Id = 2, Name = "joye.net2", Age = 18, Address = "中国上海" });
                Add(new Person { Id = 3, Name = "joye.net3", Age = 18, Address = "中国上海" });
            }
            public List<Person> GetAll()
            {
                return person;
            }
            public Person Get(int id)
            {
                return person.Find(p => p.Id == id);
            }
            public Person Add(Person item)
            {
                if (item == null)
                {
                    throw new ArgumentNullException("item");
                }
                person.Add(item);
                return item;
            }
            public bool Update(Person item)
            {
                if (item == null)
                {
                    throw new ArgumentNullException("item");
                }
    
                int index = person.FindIndex(p => p.Id == item.Id);
                if (index == -1)
                {
                    return false;
                }
                person.RemoveAt(index);
                person.Add(item);
                return true;
            }
            public bool Delete(int id)
            {
                person.RemoveAll(p => p.Id == id);
                return true;
            }
        }

    4、新建WebAPI.IServices类库,新建IPersonServices接口

        public interface IPersonServices
        {
            List<Person> GetAll();
        }

    5、IPersonServices接口在WebAPI.Services类库里面PersonServices实现

        public class PersonServices : IPersonServices
        {
            //程序集属性注入
            public IPersonRepository iPerson;
    
            public List<Person> GetAll()
            {
                return iPerson.GetAll();
            }
        }

    6、新建一个WebAPI项目WebAPI,新建AutoFacBootStrapper类,nuget安装autofac

    public class AutoFacBootStrapper
        {
            public static void CoreAutoFacInit()
            {
                var builder = new ContainerBuilder();
                HttpConfiguration config = GlobalConfiguration.Configuration;
    
                SetupResolveRules(builder);
    
                ////注册所有的Controllers
                //builder.RegisterControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired();
                //注册所有的ApiControllers
                builder.RegisterApiControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired();
    
                var container = builder.Build();
                //注册api容器需要使用HttpConfiguration对象
                config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
                DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
            }
    
            private static void SetupResolveRules(ContainerBuilder builder)
            {
                //WebAPI只用引用services和repository的接口,不用引用实现的dll。
                //如需加载实现的程序集,将dll拷贝到bin目录下即可,不用引用dll
                var iServices = Assembly.Load("WebAPI.IServices");
                var services = Assembly.Load("WebAPI.Services");
                var iRepository = Assembly.Load("WebAPI.IRepository");
                var repository = Assembly.Load("WebAPI.Repository");
    
                //根据名称约定(服务层的接口和实现均以Services结尾),实现服务接口和服务实现的依赖
                builder.RegisterAssemblyTypes(iServices, services)
                  .Where(t => t.Name.EndsWith("Services"))
                  .AsImplementedInterfaces();
    
                //根据名称约定(数据访问层的接口和实现均以Repository结尾),实现数据访问接口和数据访问实现的依赖
                builder.RegisterAssemblyTypes(iRepository, repository)
                  .Where(t => t.Name.EndsWith("Repository"))
                  .AsImplementedInterfaces();
            }
        }

    7、程序启动注入

            protected void Application_Start()
            {
                GlobalConfiguration.Configure(WebApiConfig.Register);
                AreaRegistration.RegisterAllAreas();
                RouteConfig.RegisterRoutes(RouteTable.Routes);
                FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
                BundleConfig.RegisterBundles(BundleTable.Bundles);
    
                //程序启动注入
                AutoFacBootStrapper.CoreAutoFacInit();
            }

    8.接口调用数据

            public IPersonServices IServices { get; set; }
            // GET api/<controller>
            public IEnumerable<string> Get()
            {
                var list = IServices.GetAll();
                return new string[] { "value1", "value2" };
            }

    9.运行访问api/values/,打个断点看下搞定

    三、总结

    autofac确实用起来很方便,上面只是简单的实现,如果想深入学习可以下载我上一个文章提供的两个开源的项目可以学习下,也可以到autofac官网去了解下。

    最近在看相关文章,很多都太专业化了没怎么看懂,这是自己现在对IoC的一些理解,记录下来,要不然时间一久,也就忘了。

    自己对IoC模式理解还很浅,希望得到各位的指点。

    代码下载:

    https://yunpan.cn/c6QCURhYmGcP9 (提取码:e97a)

     

    展开全文
  • 最近想学习一下做WebApi,用Autofac实现自动注入,整了半天都不好使,原来这个WebApi的注册方式跟Mvc是有区别的,话不多说直接上代码Global.asax文件中做如下修改:protected void Application_Start() { #region ...

    最近想学习一下做WebApi,用Autofac实现自动注入,整了半天都不好使,原来这个WebApi的注册方式跟Mvc是有区别的,话不多说直接上代码

    Global.asax文件中做如下修改:

    protected void Application_Start()
            {
                #region 自动注入
                //创建autofac管理注册类的容器实例
                var builder = new ContainerBuilder();
                HttpConfiguration config = GlobalConfiguration.Configuration;
                Assembly[] assemblies = Directory.GetFiles(AppDomain.CurrentDomain.RelativeSearchPath, "*.dll").Select(Assembly.LoadFrom).ToArray();
                //注册所有实现了 IDependency 接口的类型
                Type baseType = typeof(IDependency);
                builder.RegisterAssemblyTypes(assemblies)
                       .Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract)
                       .AsSelf().AsImplementedInterfaces()
                       .PropertiesAutowired().InstancePerLifetimeScope();
                //注册MVC类型
                // builder.RegisterControllers(assemblies).PropertiesAutowired();
                //注册Api类型
                builder.RegisterApiControllers(assemblies).PropertiesAutowired();
                //builder.RegisterFilterProvider();
                builder.RegisterWebApiFilterProvider(config);
                var container = builder.Build();
                //注册api容器需要使用HttpConfiguration对象
                config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
                //注册解析
                DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
                #endregion
                AreaRegistration.RegisterAllAreas();
                GlobalConfiguration.Configure(WebApiConfig.Register);
                FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
                RouteConfig.RegisterRoutes(RouteTable.Routes);
                BundleConfig.RegisterBundles(BundleTable.Bundles);

            }

    里面的IDependency接口其实就是自己建的,然后在I****service里面实现它,然后代码里很明显也很简单的能看到Mvc跟Api的区别了注掉的是Mvc的用的是builder.RegisterControllers(),如果是WebApi的话是需要换成builder.RegisterApiControllers()的,不然的话这个办法是不能用无参构造函数的方式装配的,会报***Controller需要一个无参构造的错误

    用的时候就是这个样子

    namespace JoeKwan.Controllers
    {
        public class AccountController : ApiController
        {
            private readonly IAccountServices _AccountService;
            public AccountController(IAccountServices AccountService)
            {
                _AccountService = AccountService;
            }
            public IHttpActionResult Get(int id)
            {
                Account account = _AccountService.GetAccount(id);
                return Ok(account);
            }
        }
    }

    展开全文
  • 今天用.net core + Autofac 准备建一个WebAPI的项目。在使用Autofac进行注入的时候遇到了问题。无法加载相应的应用程序集项目结构如下所示:我使用的是配置文件进行相关服务的注册 Startup.cs文件改为:Autofac配置...

    今天用.net core + Autofac 准备建一个WebAPI的项目。在使用Autofac进行注入的时候遇到了问题。无法加载相应的应用程序集

    项目结构如下所示:


    我使用的是配置文件进行相关服务的注册 Startup.cs文件改为:


    代码:

            public IServiceProvider ConfigureServices(IServiceCollection services) //这个方法的返回类型改为 IServiceProvider
            {
                services.AddMvc();
    
                //configuration
                IConfigurationBuilder config = new ConfigurationBuilder();
                config.AddJsonFile("autofac.json");
                var module = new ConfigurationModule(config.Build());
                var containerBuilder = new ContainerBuilder();
                containerBuilder.RegisterModule(module);
                containerBuilder.Populate(services);
                var container = containerBuilder.Build();
                return new AutofacServiceProvider(container);
            }


    Autofac配置文件autofac.json


    配置:

    {
      "components": [
        {
          "type": "API.Services.UserServices, API.Services",
          "services": [
            {
              "type": "API.IServices.IUserServices, API.IServices"
            }
          ],
          "injectProperties": true
        },
        {
          "type": "API.Repoistory.UserRepository, API.Repoistory",
          "services": [
            {
              "type": "API.IRepoistory.IUserRepository, API.IRepoistory"
            }
          ],
          "injectProperties": true
        }
      ]
    }

    API.Services、API.IServices、API.Repository、API.IRepository 项目的生成路径全都改到了APITest项目的bin文件夹里:


    但是。。。。在调试项目的时候却发生了奇怪的事:

    显示'API.Services.UserServices,API.Services' could not be found.It may require assembly qualification,


    不知道什么原因。发下博文看看有没有人遇到一样的问题。

    如果找到原因会更新博客

    未完待续...........

    ----------------------------------------------------2018.5.15 更新 -------------------------------------------------------

    找不到API.Services这个程序集的原因找到了,因为没有在APITest项目中引用API.Service、API.Repoistory引起的,Autofac进服务注册时相应的应用程序集必须要进行加载。虽然这样没有直接的依赖关系(引用API.Services、API.Repoistory中的类),但总感觉还是有依赖存在。

    在使用Asp.Net MVC开发时 如果使用Castle.Windsor容器进行服务的注册可以不用添加引用。直接把 API.IServices 和 API.Services 生成到 APITest 的bin文件夹里即可。

    配置文件中的这些程序集不要忘写了。

    -------ps-------

    如果还是找不到程序集的话要仔细检查atuofac.json这个配置文件里的程序集名称是否拼写正确(我上面的配置文件就把API.Repoistory 写成了 API.Repository)API.Repoistory 这个程序集的名称是对的但是单词拼错了尴尬

    展开全文
  • WebApi使用AutoFac

    2020-06-01 11:14:11
    仓储类: 复制代码 1 public interface IUsersRepository 2 { 3 int GetUserIsExists(UsersEntity criteria); 4 5 } 6 7 8 public class UsersRepository : IUsersRepository 9 { 10 Lo...
  • MVC 5 + Web API 2 配置使用Autofac

    千次阅读 2015-05-26 17:59:46
    第一次在MVC 5 + Web Api 2的模板中配置Autofac,记录备查。 Solution的结构是: 使用Web API模板创建的MVC 5和Web API2的主项目,然后将Controller单独分离出去成为一个Controller项目。 然后添加一个接口定义的...
  • http://www.cnblogs.com/zhouruifu/archive/2012/04/03/dependency-injection-in-asp-net-web-api-using-autofac.html ...【原文】Dependency Injection in ASP.NET Web API using Autofac 摘要 在ASP.NET We
  • 使用Autofac实现MVC、WebApi的注入

    千次阅读 2017-04-27 10:07:07
    http://www.cnblogs.com/yinrq/p/5383396.html
  • Autofac官方文档(二)【新版本】

    千次阅读 2017-11-29 13:50:00
    Autofac和集成软件包的发行说明 Core components Autofac Autofac.Configuration Integration librariesASP.NETWeb Forms MVC Web API SignalR RIA/Domain Services OWIN OWIN Core OWIN / Web API OWIN / MVC WCF...
  • MVC | 依赖注入 AutoFac (构造函数注入)

    万次阅读 2016-09-28 23:50:19
    参考资料:Ioc容器Autofac系列(2)-- asp.net mvc中整合autofac 1>创建Asp.net MVC项目并引入Autofac 首先,创建一个MVC站点。然后通过NuGet或到Autofac官网下载来引入类库。个人推荐前者,因为从VS2010开始,已内...
  • Web API 2集成需要Autofac.WebApi2 NuGet包。Web API集成需要Autofac.WebApi NuGet包。Web API集成为控制器,模型绑定器和操作过滤器提供了依赖注入集成。 它也增加了每个请求生命周期的支持。本页面介绍了ASP.NET...
  • 最近项目中使用Autofuc实现依赖注入时出现错误: None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type 'PoyaYun.Controllers.MainController' can be ...
  • WebAPI使用Autofac (过滤器的注册)

    千次阅读 2018-06-28 00:33:33
    不要错误的安装Autofac.Mvc5,也不要错误的安装Autofac.WebApi,因为Autofac.WebApi是给webapi1的,否则会报错:重写成员“Autofac.Integration.WebApi.AutofacWebApiDependencyResolver.BeginScope()”时违反了继承...
  • Autofac创建实例的方法总结

    万次阅读 2013-06-09 11:05:49
    1、InstancePerDependency 对每一个依赖或每一次调用创建一个新的唯一的实例。这也是默认的创建实例的方式。 官方文档解释:Configure the component so that every dependent component or call to Resolve() ...
  • Autofac Web及WebApi注册

    千次阅读 2020-06-22 10:51:48
    前阵子公司新启动个项目,领导要求使用autofac,听过没用过,so.......研究一番,直接上干货! Autofac WebApi注册步骤 项目中添加autofacautofac.webapi2的引用 App_Start文件夹中添加AutofacConfig_Web...
  • .NET领域最为流行的IOC框架之一Autofac

    千次阅读 2018-06-18 09:44:12
    一、前言Autofac是.NET领域最为流行的IOC框架之一,微软的Orchad开源程序使用的就是Autofac,Nopcommerce开源程序也是用的Autofac。Orchad和Nopcommerce在用Autofac的时候进行封装,看过源码的都知道Autafac使用简单...
  • AutoFac 依赖注入之XML/JSON配置文件

    千次阅读 2018-06-12 16:31:18
    AutoFac提供编程接口以及基于XML/JSON文件的配置支持,实现IOC。Autofac鼓励通过ContainerBuilder类进行编程配置。使用编程接口是容器设计的核心。 如果在编译时无法选择或配置具体类,则建议使用JSON或XML。一.使用...
  • OWIN全称Open Web Interface for .NET(.NET的开放式Web接口),是一种更简单的模型,用于(在不将应用程序绑定到Web服务器的情况下)编写基于Web的应用程序。为此,使用“中间件”的概念来创建请求所经过的管道。...
  • 同事发现一个接口出现{"Message":"出现错误。"},然后本地连网上数据库,正常。。。 配置下&...customErrors mode="...,出现了“请确保控制器具有无参数公共构造函数” ...
  • 今天我们试着在WebApi2实现autofac的注入,关于这方面也是看了几位园友的分享省了不少时间,所以结合着前篇的demo再新建webapi进行... demo3下载地址: http://pan.baidu.com/s/1eSCAZtC 一样开篇还是发下大概demo...
1 2 3 4 5 ... 20
收藏数 1,867
精华内容 746
关键字:

webapi 使用autofac