Autofac +webapi 配置
Autofac配置
using Autofac;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.Http;
using Autofac.Integration.Mvc;
using Autofac.Integration.WebApi; namespace WebAutoFac
{
/// <summary>
/// Autofac配置
/// </summary>
public class AutoFacBootStrapper
{
/// <summary>
/// Autofac配置
/// </summary>
public static void CoreAutoFacInit()
{
#region MVC---install-package autofac.mvc5 注意版本 //var builder = new ContainerBuilder(); //SetupResolveRules(builder); ////注册所有的Controllers
//builder.RegisterControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired();
//var container = builder.Build();
//System.Web.Mvc.DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); #endregion #region Webapi和MVC ---install-package autofac.mvc5 install-package autofac.webapi2 注意版本 var builder = new ContainerBuilder();
SetupResolveRules(builder); //注册所有的Controllers
builder.RegisterControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired();
//注册所有的ApiControllers
builder.RegisterApiControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired(); var container = builder.Build();
//注册所有的Controllers
builder.RegisterControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired();
//注册api容器需要使用HttpConfiguration对象
HttpConfiguration config = GlobalConfiguration.Configuration;
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
System.Web.Mvc.DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); #endregion #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 //有了 IDependency 这个基接口,我们只需要 Global 中很简单的几行代码,就可以完成整个系统的依赖注入匹配
//ContainerBuilder builder = new ContainerBuilder();
//builder.RegisterGeneric(typeof(Repository<,>)).As(typeof(IRepository<,>));
//Type baseType = typeof(IDependency); //// 获取所有相关类库的程序集
//Assembly[] assemblies = ... //builder.RegisterAssemblyTypes(assemblies)
// .Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract)
// .AsImplementedInterfaces().InstancePerLifetimeScope();//InstancePerLifetimeScope 保证对象生命周期基于请求
//IContainer container = builder.Build();
//DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
} private static void SetupResolveRules(ContainerBuilder builder)
{
//WebAPI只用引用services和repository的接口,不用引用实现的dll。
//如需加载实现的程序集,将dll拷贝到bin目录下即可,不用引用dll
var iServices = Assembly.Load("IBLL");
var services = Assembly.Load("BLL");
//var iRepository = Assembly.Load("WebAPI.IRepository");
//var repository = Assembly.Load("WebAPI.Repository"); //根据名称约定(服务层的接口和实现均以Services结尾),实现服务接口和服务实现的依赖
builder.RegisterAssemblyTypes(iServices, services)
.Where(t => t.Name.EndsWith("BLL"))
.AsImplementedInterfaces(); ////根据名称约定(数据访问层的接口和实现均以Repository结尾),实现数据访问接口和数据访问实现的依赖
//builder.RegisterAssemblyTypes(iRepository, repository)
// .Where(t => t.Name.EndsWith("Repository"))
// .AsImplementedInterfaces(); //var cont = Assembly.Load("WebAutoFac");
////根据名称约定(服务层的接口和实现均以Services结尾),实现服务接口和服务实现的依赖
//builder.RegisterAssemblyTypes(cont)
// .Where(t => t.Name.EndsWith("Controller"))
// .AsImplementedInterfaces(); ////使用新的覆盖旧的注册DLL-使用UserNew代替UserOld
//builder.RegisterType<BLL.UserBLL>().As<IBLL.IUserBLL>(); }
}
}
using Autofac;
using BLL;
using IBLL;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Reflection;
using System.Web.Http; namespace WebAutoFac.Controllers
{
/// <summary>
///
/// </summary>
[RoutePrefix("User")]
public class UserController : ApiController
{
private IUserBLL _userBll;
private IPeopleBLL _peopleBll; /// <summary>
///
/// </summary>
/// <param name="userBLL"></param>
/// <param name="peopleBll"></param>
public UserController(IUserBLL userBLL, IPeopleBLL peopleBll)
{
_userBll = userBLL;
_peopleBll = peopleBll;
}
/// <summary>
/// 最原始的方式直接new(需添加对BLL层的引用)
/// </summary>
/// <returns></returns>
[HttpGet,Route("Refernce")]
public string GetUserInfoByRefernce()
{
UserBLL userBll = new UserBLL();
var result = userBll.GetUserInfor();
return result;
} /// <summary>
/// 面向接口编程(仍需添加对BLL层的引用)
/// </summary>
/// <returns></returns>
[HttpGet, Route("Interface")]
public string GetUserInfoByInterface()
{
IUserBLL userBll = new UserBLL();
var result = userBll.GetUserInfor();
return result;
}
/// <summary>
/// 接口+反射(只需将BLL层的程序集拷贝进来)
/// </summary>
/// <returns></returns>
[HttpGet, Route("Reflection")]
public string GetUserInfoByReflection()
{
Assembly ass = Assembly.Load("BLL.dll");
Type type = ass.GetType("BLL.UserBLL");
//调用默认的无参构造函数进行对象的创建
object myUserBll = Activator.CreateInstance(type);
IUserBLL userBll = myUserBll as IUserBLL;
var result = userBll.GetUserInfor();
return result;
} /// <summary>
/// 测试AUTOFAC
/// </summary>
/// <returns></returns>
[HttpGet, Route("testAutofac")]
public string Test()
{
//IUserBLL userBLL = System.Web.Mvc.DependencyResolver.Current.GetService<IUserBLL>();
var builder = new ContainerBuilder();
builder.RegisterType<UserBLL>().As<IUserBLL>();
var container = builder.Build().BeginLifetimeScope();
var userBll = container.Resolve<IUserBLL>();
var result = userBll.GetUserInfor("Autofac");
return result;
//var result = _userBLL.GetUserInfor("Autofac");
//return result;
} /// <summary>
///
/// </summary>
/// <returns></returns>
[HttpGet, Route("Assembly")]
public string GetUserInfo()
{
//1、使用nupkg引用Autofac,Autofac.Mvc5和Autofac.Webapi2
//PM > install-package autofac - version 3.5.0
//PM > install-package autofac.mvc5
//PM > install-package autofac.webapi2
//(注意:您的项目中如果使用的是webapi2,此处必须为webapi2而不是webapi,
//否则在运行时将出现“重写成员“Autofac.Integration.WebApi.AutofacWebApiDependencyResolver.BeginScope()”时违反了继承安全性规则。
//重写方法的安全可访问性必须与所重写方法的安全可访问性匹配。”错误。) mvc同样
string strUserInfo = _userBll.GetUserInfor("user-Assembly");
string strPeople = _peopleBll.Introduce("people-Assembly");
string result = strUserInfo + "," + strPeople;
return result;
} // GET api/<controller>
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
} // GET api/<controller>/5
public string Get(int id)
{
return "value";
} // POST api/<controller>
public void Post([FromBody]string value)
{
} // PUT api/<controller>/5
public void Put(int id, [FromBody]string value)
{
} // DELETE api/<controller>/5
public void Delete(int id)
{
}
}
}
UserController
netcore;
//DI了AutoMapper中需要用到的服务,其中包括AutoMapper的配置类 Profile
services.AddAutoMapper();
var builder = new ContainerBuilder();
builder.Populate(services);
builder.RegisterAssemblyTypes(typeof(ManagerRoleRepository).Assembly)
.Where(t => t.Name.EndsWith("Repository"))
.AsImplementedInterfaces();
builder.RegisterAssemblyTypes(typeof(ManagerRoleService).Assembly)
.Where(t => t.Name.EndsWith("Service"))
.AsImplementedInterfaces();
return new AutofacServiceProvider(builder.Build());
}
netcore 配置
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddMvc();
var builder = new ContainerBuilder();//实例化 AutoFac 容器
var assemblys = Assembly.Load("Service");//Service是继承接口的实现方法类库名称
var baseType = typeof(IDependency);//IDependency 是一个接口(所有要实现依赖注入的借口都要继承该接口)
builder.RegisterAssemblyTypes(assemblys)
.Where(m => baseType.IsAssignableFrom(m) && m != baseType)
.AsImplementedInterfaces().InstancePerLifetimeScope(); builder.Populate(services);
ApplicationContainer = builder.Build();
return new AutofacServiceProvider(ApplicationContainer);//第三方IOC接管 core内置DI容器 } ConfigureServices方法由void改为返回IServiceProvider
https://www.cnblogs.com/shacoli/p/8523866.html
https://www.cnblogs.com/xujie520/p/5200815.html
https://www.cnblogs.com/yanweidie/p/autofac.html
https://www.cnblogs.com/lenmom/p/9081658.html
https://blog.csdn.net/ad996454914/article/details/80901105
https://www.cnblogs.com/yanweidie/p/autofac.html
Autofac +webapi 配置的更多相关文章
- Autofac 及 Autofac.WebApi 与MVC版本兼容问题
环境:vs2013 下载 Autofac 时,会自动把 Microsoft.AspNet.Mvc 更新到 5.2.3.原来是 5.0.0.0 再使用 Autofac.WebApi , 出现以下问题: ...
- Asp.Net WebAPI配置接口返回数据类型为Json格式
Asp.Net WebAPI配置接口返回数据类型为Json格式 一.默认情况下WebApi 对于没有指定请求数据类型类型的请求,返回数据类型为Xml格式 例如:从浏览器直接输入地址,或者默认的XM ...
- .net core webapi 配置swagger调试界面
一.创建一个.net core webapi的项目: 二.在nuget程序包管理器控制台输入 Install-Package Swashbuckle -version 6.0.0-beta902 ...
- Asp.net WebApi 配置 Swagger UI
首先安装Swashbuckle.Core 然后添加swagger配置文件. [assembly: PreApplicationStartMethod(typeof(SwaggerConfig), &q ...
- Autofac通过配置的方式
autofac是比较简单易用的IOC容器.下面我们展示如何通过json配置文件,来进行控制反转. 需要用到以下程序集.可以通过nugget分别安装 Microsoft.Extensions.Confi ...
- Asp.net Mvc、webApi配置允许跨域
Web.config 下<system.webServer> 节点下配置 <httpProtocol> <customHeaders> <add name=& ...
- C# WebApi 配置复杂路由不生效的问题
配置复杂路由不生效是由于优先级的关系,应该把默认路由放在最后. config.Routes.MapHttpRoute( name: "DynamicApi", routeTempl ...
- asp.net core webapi 配置跨域处理
在Startup.cs文件中的ConfigureServices方法中加入如下代码: //配置跨域处理 services.AddCors(options => { options.AddPoli ...
- webapi框架搭建-依赖注入之autofac
前言 c#的依赖注入框架有unity.autofac,两个博主都用过,感觉unity比较简单而autofac的功能相对更丰富(自然也更复杂一点),本篇将基于前几篇已经创建好的webapi项目,引入au ...
随机推荐
- 【RabbitMQ学习记录】- 消息队列存储机制源码分析
本文来自 网易云社区 . RabbitMQ在金融系统,OpenStack内部组件通信和通信领域应用广泛,它部署简单,管理界面内容丰富使用十分方便.笔者最近在研究RabbitMQ部署运维和代码架构,本篇 ...
- 「HNOI 2013」游走
题目链接 戳我 \(Solution\) 首先申明几个变量: f[x]:到点x的概率, vis[x]:x点的度 dp[x][y]:(x,y)这条边的概率 number[x][y]:x这条边的编号 下面 ...
- 201621123023《Java程序设计》第7周学习总结
一.本周学习总结 1.1 思维导图:Java图形界面总结 二.书面作业 1. GUI中的事件处理 1.1 写出事件处理模型中最重要的几个关键词. 关键词:事件源.事件监听器.事件处理方法.事件适配器 ...
- gulp 图片、样式、js、实时刷新等压缩gulpfile.js文件各个模块
1.压缩tinypng图片 gulp-tinypng-nokey,但不压缩gif格式(另外一个gulp-imagemin压缩率不高,可以压缩gif格式) // 获取 gulp var gulp = ...
- “全栈2019”Java第八十章:外部类是否能实现本类中的接口?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 使用ls,du命令进行文件排序
一. 使用du命令进行大小排序 du -h --max-depth=1 | sort -hr 参数说明: --max-depth:表示要查看几层目录 sort -r:反向显示 sort -h: ...
- 部署LAMP架构及其应用
部署企业LAMP架构 (一)首先安装Apache服务,具体请见另一篇关于Apache的博文. (二)安装MySQL数据库,具体请见另一篇关于LNMP的博文. (三)构建PHP运行环境 1.安装PHP ...
- C# 服务端推送,十步十分钟,从注册到推送成功
目标 展示 C# 服务端集成极光推送的步骤,多图少字,有图有真相. 使用极光推送, C# 服务端推送到 Demo App,Android 手机收到推送,整理为十个步骤,使用十分钟左右,完成从注册账号到 ...
- 2019.2.15 t2
考虑倒过来计算最短路径长度,设dis[u]表示在最坏情况下,点u到最近的一 个出口的最短路,则p个出口的dis值都是0,答案即为dis[0]. #include <cstdio> #inc ...
- P4097 [HEOI2013]Segment 李超线段树
$ \color{#0066ff}{ 题目描述 }$ 要求在平面直角坐标系下维护两个操作: 在平面上加入一条线段.记第 i 条被插入的线段的标号为 i 给定一个数 k,询问与直线 x = k 相交的线 ...