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 ...
随机推荐
- 爬虫开发14.scrapy框架之分布式操作
分布式爬虫 一.redis简单回顾 1.启动redis: mac/linux: redis-server redis.conf windows: redis-server.exe redis-wi ...
- 洛谷P4337 [ZJOI2018]线图(状压+搜索+乱搞)
题面 传送门 题解 妈呀调了我整整一天-- 题解太长了不写了可以去看\(shadowice\)巨巨的 //minamoto #include<bits/stdc++.h> #define ...
- CH5101 LCIS
CH5101 LCIS 题意: 求两个长度不超过3000的序列的最长公共上升子序列 思路: 朴素解法:用f[i,j]表示a1~ai与b1~bj可以构成的以bj为结尾的LCIS的长度,三重循环求解: ; ...
- POJ-3126-Prime Path(BFS)
Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 27852 Accepted: 15204 Desc ...
- 条目二十四《当效率至关重要时,请在map::operator[]与map::insert之间谨慎做出选择》
条目二十四<当效率至关重要时,请在map::operator[]与map::insert之间谨慎做出选择> 当效率至关重要时,应该在map::operator[]和map::insert之 ...
- Linux一些常用的基础命令,总结的很好,收藏了
原文地址:https://www.cnblogs.com/yjd_hycf_space/p/7730690.html
- ubuntu 使用ifupdown 进行高级网络设置
ifupdown ubuntu 本身支持linux的网络底层设置命令:ifconfig,route,ip 等命令,但为了让网络设置更加简单,Debian 提供了一个标准的高级网络设置工具,包含 ifu ...
- Windows下安装Redis服务(zip)
1.官方没有 Windows版本的 Redis,官网介绍: Redis项目不正式支持Windows.但是,微软开发并维护了针对Win64的Windows版本. 2.Windows版本下载地址:http ...
- Doc/Docx/PDF to Html
TODO 判断源文件是否有格式??
- EndNote登陆Web账号时解决不断询问用户名密码
EndNote登陆Web账号时不断询问用户名密码怎么破?EndNote有个同步功能,在登陆Web账号时,EndNote不断的询问账号和密码,可是用户名和密码明明已经填写正确和完毕,就是登陆不上EndN ...