AutoFac初探
#region RegisterType注册
var builder = new ContainerBuilder();
builder.RegisterType<DatabaseManager>();
builder.RegisterType<SqlDatabase>().As<IDatabase>();//通过AS可以让DatabaseManager类中通过构造函数依赖注入类型相应的接口。
using (var container = builder.Build())
{
// var sqlIntance = container.Resolve<SqlDatabase>(); 【报错:】使用As方法会将原件默认的服务覆盖掉,所以无法用这种方式取得对象
var sqlIntance = container.Resolve<IDatabase>();
var manager = container.Resolve<DatabaseManager>();
manager.Search("Select * from User");
}
#endregion
#region 属性注入
/*
* 属性注入
这是推荐的属性初始化方式. IComponentContext.ResolveOptional() 很方便:
*
builder.Register(c => new A(){ MyB = c.ResolveOptional<B>() });
*
或者, PropertiesAutowired() 这个方法也可以导致属性注入.
*
builder.RegisterType<X>().PropertiesAutowired();
*/
#endregion
#region 配置文件进行注册
//var builder = new ContainerBuilder();
//builder.RegisterType<DatabaseManager>();
//builder.RegisterModule(new ConfigurationSettingsReader("autofac"));
//using (var container = builder.Build())
//{
// var manager = container.Resolve<DatabaseManager>();
// manager.Search("Select * form user");
//}
/*
* 这里通过ContainerBuilder方法RegisterType对DatabaseManager进行注册,当注册的类型在相应得到的容器中可以Resolve你的DatabaseManager实例。
builder.RegisterType<SqlDatabase>().As<IDatabase>();通过AS可以让DatabaseManager类中通过构造函数依赖注入类型相应的接口。
Build()方法生成一个对应的Container实例,这样,就可以通过Resolve解析到注册的类型实例。
*/
#endregion
#region 通过Register方法进行注册
//var builder = new ContainerBuilder();
//builder.RegisterModule(new ConfigurationSettingsReader("autofac"));
//builder.Register(c => new DatabaseManager(c.Resolve<IDatabase>())); //构造函数注入,c是创建元件的容器
//using (var container = builder.Build())
//{
// var manager = container.Resolve<DatabaseManager>();
// manager.Search("Select * from User");
//}
#endregion
#region MyRegion
//User user = new User { Id = 1, Name = "leepy" };
//var builder = new ContainerBuilder();
//builder.RegisterModule(new ConfigurationSettingsReader("autofac"));
//builder.RegisterInstance(user).As<User>(); //已经存在的实例user,这时就不能再创造对象而是应该在容器中将它注册为实例,这种方法会确保系统中的单例实例最终转化为由容器托管的单例实例.
//builder.Register(c => new DatabaseManager(c.Resolve<IDatabase>(), c.Resolve<User>()));
//using (var container = builder.Build())
//{
// var manager = container.Resolve<DatabaseManager>();
// manager.Add("INSERT INTO USER ...");
//}
#endregion
#region 开放的泛型类型
/*
* 开放的泛型类型
autofac支持开放的泛型类型.使用 RegisterGeneric() 这个方法:
builder.RegisterGeneric(typeof(NHibernateRepository<>))
.As(typeof(IRepository<>))
.InstancePerLifetimeScope();
当从容器中请求一个匹配的类型时,autofac会自动匹配一个等价的具体实现类型.
// Autofac will return an NHibernateRepository<Task>
var tasks = container.Resolve<IRepository<Task>>();
注册一个具体的类型((e.g. IRepository<Person> )会覆盖掉上面的泛型注册.
*/
#endregion
#region 【扫描组件】
var dataAccess = Assembly.GetExecutingAssembly();
builder.RegisterAssemblyTypes(dataAccess).Where(t => t.Name.EndsWith("Repository")).AsImplementedInterfaces();
//每个RegisterAssemblyTypes方法只能应用一套规则。如果有多套不同的集合要注册,那就有必要多次调用RegisterAssemblyTypes。
/*
* 选择类型
RegisterAssemblyTypes接受程序集的集合。默认情况下,程序集中所有公共具体的类都会被注册。
如果想要过滤注册的类型,可以使用Where.向下面这样:
Where(t => t.Name.EndsWith("Repository"))
如果想要排除某些类型,使用Except():
Except<MyUnwantedType>()
或者,自定义那些已经排除的类型的注册:
Except<MyCustomisedType>(ct =>ct.As<ISpecial>().SingleInstance())
多个过滤器可以同时使用,这时他们之间是AND的关系
*
*
* RegisterAssemblyTypes这个注册方法是注册单个方法的超集,所以类似As的方法也可以用在程序集中,例如
As<IRepository>()
As和Named这两个方法额外的重载方法接受lambda表达式来决定服务会提供什么样的类型。
*/
#endregion
#region 【 Per Dependency】
/*
Per Dependency
在其他容器中也称作瞬态或者工厂,使用Per Dependency作用域,服务对于每次请求都会返回单独的实例。
在没有指定其他参数的情况下,这是默认是作用域。
builder.RegisterType<X>();
or
builder.RegisterType<X>().InstancePerDependency();
*/
#endregion
#region [Single Instance]
/*
Single Instance
使用Single Instance作用域,所有对父容器或者嵌套容器的请求都会返回同一个实例。
builder.RegisterType<X>().SingleInstance();
*/
#endregion
************************************************分割线********************************************************************
//以IoC依赖注入方式创建对象
using (var container = RegisterContainer())
{
container.Resolve<MemoChecker>().CheckNow();
Console.ReadKey();
}
/// <summary>
/// 注册组件容器
/// </summary>
/// <returns></returns>
private static IContainer RegisterContainer()
{
//使用Autofac的依赖注入后的方式
//创建构造器
var builder = new ContainerBuilder();
//登记MemoChecker组件
builder.Register(c=>new MemoChecker(
c.Resolve<IQueryable<Memo>>(),
c.Resolve<IMemoDueNotifier >()
));
//登记PrintingNotifier组件
builder.Register(c => new PrintingNotiffer(c.Resolve<TextWriter>())).As<IMemoDueNotifier>();
//注册实例对象
builder.RegisterInstance(memos);
builder.RegisterInstance(Console.Out).As<TextWriter>().ExternallyOwned();
//检查依赖关系生成器
return builder.Build();
}
*************************************************分割线***************************************************************************
#region
//var builer = new ContainerBuilder();
//builer.RegisterType<Dog>().As<IBehavior>();
//builer.RegisterType<Cat>().As<IBehavior>().PreserveExistingDefaults(); //PreserveExistingDefaults方法不会覆盖前面注册的服务
//var container = builer.Build();
//var dog = container.Resolve<IBehavior>();
//dog.Call();
#endregion #region 【按名字进行注册】
//var builder = new ContainerBuilder();
//builder.RegisterType<Dog>().Named<IBehavior>("a");
//builder.RegisterType<Cat>().Named<IBehavior>("b");
//var container = builder.Build();
//var dog = container.ResolveNamed<IBehavior>("a");
//var cat = container.ResolveNamed<IBehavior>("b");
//dog.Call();
//cat.Call();
#endregion #region 【注册服务按键来检索】
//var builder = new ContainerBuilder();
//builder.RegisterType<OnlineState>().Keyed<IDeviceState>(DeviceState.Online);
//builder.RegisterType<OfflineState>().Keyed<IDeviceState>(DeviceState .Offline );
////使用显示检索
//var container = builder.Build();
//var r = container.ResolveKeyed<IDeviceState>(DeviceState .Online); //这种方式不推荐
#endregion #region【自动装配】
//从容器中可用的服务中选择一个构造函数来创造对象,这个过程叫做自动装配。
ContainerBuilder builer= new ContainerBuilder();
builer.RegisterType<Dog>().UsingConstructor(typeof(int));//选择int类型的构造函数来进行实例化
#endregion
/// <summary>
/// 根据索引获得实例
/// </summary>
public class Modem : IHardwareDevice
{
IIndex<DeviceState, IDeviceState> _states;
IDeviceState _currentState;
public Modem(IIndex<DeviceState, IDeviceState> states)
{
_states = states;
SwitchOn();//在SwitchOn方法中。使用索引从前面用DeviceState.Online做键注册的IDeviceState的实现。 }
void SwitchOn()
{
_currentState = _states[DeviceState.Online];
}
}
*************************************************分割线**********************************************************************
ContainerBuilder builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly()); //1.builder.RegisterControllers注册了当前程序集内所有的Controller类。
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).AsImplementedInterfaces();//2.builder.RegisterAssemblyTypes注册了当前程序集内的所有类。这里的AsImplementedInterfaces表示以接口的形式注册
builder.RegisterType<DLog>().As<ILog>(); //如果对象被多次注册,则以最后注册为准
// builder.RegisterType<DLog>().As<ILog>().PreserveExistingDefaults();//为了避免以最后一次注册为准,可以使用 PreserveExistingDefaults() 修饰符,这样就以第一次注册的为准
var container = builder.Build(); //创建一个容器 DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
*************************************************分割线************************************************************************
//注册整个程序集
public static void Run()
{
// var builder = new ContainerBuilder(); //var datadal = Assembly.Load("SqlServerDAL");
//builder.RegisterAssemblyTypes(datadal).Where(a => a.FullName.Contains("SqlServerDAL")).AsImplementedInterfaces(); //var databll = Assembly.Load("BLL");
//builder.RegisterAssemblyTypes(databll).Where(a => a.FullName.Contains("BLL")).AsImplementedInterfaces(); //builder.RegisterControllers(Assembly.GetExecutingAssembly());
// var contain = builder.Build();
// DependencyResolver.SetResolver(new AutofacDependencyResolver(contain));
}
//将Autofac容器中的实例注册到mvc自带DI容器中(这样才获取到每请求缓存的实例)
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
<!---配置文件注册时需要修改配置文件--->
<configuration>
<configSections>
<section name="autofac" type="Autofac.Configuration.SectionHandler, Autofac.Configuration"/>
</configSections>
<autofac defaultAssembly="AutofacDemo">
<components>
<component type="AutofacDemo.SqlDatabase, AutofacDemo" service="AutofacDemo.IDatabase" />
</components>
</autofac>
</configuration>
AutoFac初探的更多相关文章
- 从壹开始微服务 [ DDD ] 之七 ║项目第一次实现 & CQRS初探
前言 哈喽大家周五好,我们又见面了,感谢大家在这个周五读我的文章,经过了三周的时间,当然每周两篇的速度的情况下,咱们简单说了下DDD领域驱动设计的第一部分,主要包括了,<项目入门DDD架构浅析& ...
- 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之九 || 依赖注入IoC学习 + AOP界面编程初探
更新 1.如果看不懂本文,或者比较困难,先别着急问问题,我单写了一个关于依赖注入的小Demo,可以下载看看,多思考思考注入的原理: https://github.com/anjoy8/BlogArti ...
- 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十二 || 三种跨域方式比较,DTOs(数据传输对象)初探
更新反馈 1.博友@落幕残情童鞋说到了,Nginx反向代理实现跨域,因为我目前还没有使用到,给忽略了,这次记录下,为下次补充.此坑已填 2.提示:跨域的姊妹篇——<三十三║ ⅖ 种方法实现完美跨 ...
- Z从壹开始前后端分离【 .NET Core2.2/3.0 +Vue2.0 】框架之九 || 依赖注入IoC学习 + AOP界面编程初探
本文梯子 本文3.0版本文章 更新 代码已上传Github+Gitee,文末有地址 零.今天完成的绿色部分 一.依赖注入的理解和思考 二.常见的IoC框架有哪些 1.Autofac+原生 2.三种注入 ...
- AutoFac在项目中的应用
技能大全:http://www.cnblogs.com/dunitian/p/4822808.html#skill 完整Demo:https://github.com/dunitian/LoTCode ...
- Autofac - MVC/WebApi中的应用
Autofac前面写了那么多篇, 其实就是为了今天这一篇, Autofac在MVC和WebApi中的应用. 一.目录结构 先看一下我的目录结构吧, 搭了个非常简单的架构, IOC(web), IBLL ...
- Autofac - 生命周期
实例生命周期决定在同一个服务的每个请求的实例是如何共享的. 当请求一个服务的时候,Autofac会返回一个单例 (single instance作用域), 一个新的对象 (per lifetime作用 ...
- Autofac - 属性注入
属性注入不同于通过构造函数方式传入参数. 这里是通过注入的方式, 在类创建完毕之后, 资源释放之前, 给属性赋值. 这里, 我重新弄一些类来演示这一篇吧. public class ClassA { ...
- Autofac 的点滴
泛型类型的注册和使用 public interface IRepository<T> where T:class { } public interface ISchoolDetailRep ...
随机推荐
- ArcGIS10.3.1于2015年6月发布
http://www.esrichina.com.cn/sectorapplication/ArcGIS%2010.3/index.html
- CMarkUp读写XML(转)
Fast start to XML in C++ Enough bull. You want to create XML or read and find things in XML. All you ...
- [hdu5136]Yue Fei's Battle 2014 亚洲区域赛广州赛区J题(dp)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud 现场赛的时候由于有个地方有点小问题,没有成功AC,导致与金牌失之交臂. 由于今天下 ...
- android 利用重力感应监听 来电时翻转手机后静音。
在CallNotifier.java中 加入如下代码: public void GetSensorManager(Context context) { sm = (SensorManager) ...
- yii2 改变首页,变成登录页
在main.php中添加'defaultRoute'=>'site/login',//默认路由,控制显示的第一个页面,控制器+方法
- [C++程序设计]用指针变量作函数参数接收数组地址
#include <iostream> using namespace std; void select_sort(int *p, int n) { int i, j, k; ; i &l ...
- php get_ini 和 get_cfg_var 的区别
get_ini 和 get_cfg_var 都是用来获取 php 配置信息的函数. 区别是 get_ini 是用来获取当前运行的配置信息,get_cfg_var 是用来获取配置文件(php.ini)的 ...
- Python学习(七) 流程控制if语句
在Python中流程控制if语句采用如下格式: if expression : statement elif expression : statement elif expression : stat ...
- http://www.cnblogs.com/Joyes1989/archive/2013/06/28/3161739.html centos 输入法安装切换
昨天装了一个centos 安装输入法的时候 让我有点纠结 全英文的 读不懂
- 华为IC设计人员的薪酬(5年经验28万),以及麒麟是如何脱颖而出的~
垂直整合助力麒麟腾飞 由于ARM技术路线大幅降低了技术门槛和研发的资金和时间成本,导致ARM阵营参与者众多,加上大家都是购买ARM的CPU核与GPU核,造成产品高度同质化,市场竞争异常激烈——在价格上 ...