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 ...
随机推荐
- JavaScript ----------- 组合继承
继承 实现继承:继承实际的方法.ECMAScript 只支持实现继承,而且其实现基础主要是依靠原型链来实现的. 基本思想是:利用原型来实现一个引用类型继承另外一个引用类型的属性和方法. 原型 - 构造 ...
- 关于scrollTop
如下图
- struts2面试题
由于找了很久的工作都没有找的,只能四处收集那个面试题的.和看面试题的 还有那个记忆力也不是很好了的,而那些公司面试的时候总会有一个面试题的! 在这里分享给大家(那个本来是想上传文件的,但是找不到的 ...
- Canvas绘图方法和图像处理方法(转)
转自:http://javascript.ruanyifeng.com/htmlapi/canvas.html 概述 Canvas API(画布)用于在网页实时生成图像,并且可以操作图像内容,基本上它 ...
- sketchup 导出 fbx文件 单位 错误
最近在使用sketchup导出fbx文件到unity中使用时,发生了尺度单位上的错误.按照网上给出的标准教程,选定模型的单位为十进制-米.导出时选项选择'米',但是得到的fbx文件在unity中出现了 ...
- protobuf 参考资料
Protocol Buffers 官网下载地址:https://developers.google.com/protocol-buffers/docs/downloads Protocol Buffe ...
- pp to write
vanishing gradient problem multi-dimensional lstm
- mysql 复习与学习(二)数据库及表结构的创建删除
mysql -h localhost -uroot -p123456 //连接数据库 show databases; //查看数据库 create database if not exists db_ ...
- js去除左右空格
replace方法去掉字符串的空格 //去左空格; s=s.replace(/(^\s*)/g, ""); //去右空格; s= s.replace(/(\s*$)/g, &qu ...
- ubuntu 中c 语言编程(学习)
ubuntu下c编程 c编程中相关文件后缀 .a 静态库(archive .c C源代码(需要编译预处理) .h C源代码头文件 .i C源代码 (不需要编译预处理) ...