Autofac - 属性注入
属性注入不同于通过构造函数方式传入参数. 这里是通过注入的方式, 在类创建完毕之后, 资源释放之前, 给属性赋值.
这里, 我重新弄一些类来演示这一篇吧.
public class ClassA
{
private readonly ClassB b; public ClassA(ClassB b)
{
this.b = b;
} public void Show()
{
Console.WriteLine("I am ClassA's instance !");
}
} public class ClassB
{
public ClassA A { get; set; } public void Show()
{
Console.WriteLine("I am ClassB's instance !");
} } public class ClassC
{
public string Name { get; set; }
public ClassD D { get; set; } public void Show()
{
Console.WriteLine("I am ClassC's instance !" + Name);
}
} public class ClassD
{
public void Show()
{
Console.WriteLine("I am ClassD's instance !");
}
}
1. 一般方法
var builder = new ContainerBuilder();
builder.Register(n => new ClassC { D = n.Resolve<ClassD>(), Name = "Sniper" });
builder.RegisterType<ClassD>();
var container = builder.Build();
var c = container.Resolve<ClassC>();
c.Show();
c.D.Show();

这种方法, 不止可以注入属性, 还可以给字段赋值
2. 反射的方式
var builder = new ContainerBuilder(); builder.RegisterType<ClassD>();
var s = builder.RegisterType<ClassC>().PropertiesAutowired(); var container = builder.Build(); var c = container.Resolve<ClassC>();
c.Show();
c.D.Show();

这里需要注意一点, 由于ClassC中有ClassD格式的属性, 所以ClassD也必须要注册一下. 为什么呢? 来看一下源码

PropertiesAutowired()方法里面, 主要就是调用上图中的方法. 会通过反射的方式获取属性, 然后也是通过Resolve的方式来获取属性的值.
注:
仔细观察ClassA和ClassB, 可以发现, 他们循环依赖了, 那么如果我要得到ClassB, 怎么办? 尝试下第一种方法, 你会发现, 我去, 报错了.
尝试下第二种方法, 还是报错. 那怎么办呢?
var builder = new ContainerBuilder(); builder.RegisterType<ClassB>().PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies).SingleInstance();
builder.Register(n=>new ClassA(n.Resolve<ClassB>())); var container = builder.Build(); var b = container.Resolve<ClassB>();
b.Show();
b.A.Show();

还是通过反射的方式, 只不过要注意一下, 传入参数和SingleInstance, 不加, 都会报错的.
3. 通过名称
var builder = new ContainerBuilder();
var s = builder.RegisterType<ClassC>().WithProperty("D", new ClassD());
var container = builder.Build();
var c = container.Resolve<ClassC>();
c.Show();
c.D.Show();

通过属性名称, 直接new一个实例给他
4. OnActivating/OnActivated 方式
此方法的执行时机, 是构造函数创建结束之后, 资源释放之前, 所以在此期间也可以实现
var builder = new ContainerBuilder(); builder.RegisterType<ClassC>().OnActivating(e => e.Instance.D = e.Context.Resolve<ClassD>());
builder.RegisterType<ClassD>(); var container = builder.Build(); var c = container.Resolve<ClassC>();
c.Show();
c.D.Show();
这里的 OnActivating 也可换成 OnActivated . 实现这里的场景, 是能得到一样的结果的.
参考:
Autofac - 属性注入的更多相关文章
- MVC autofac 属性注入
Global文件 public class MvcApplication : System.Web.HttpApplication { private static IContainer Contai ...
- ASP.NET Core中使用Autofac进行属性注入
一些无关紧要的废话: 作为一名双修程序员(自封的),喜欢那种使用Spring的注解形式进行依赖注入或者Unity的特性形式进行依赖注入,当然,形式大同小异,但结果都是一样的,通过属性进行依赖注入. A ...
- Autofac 的属性注入,IOC的坑
Autofac 是一款优秀的IOC的开源工具,完美的适配.Net特性,但是有时候我们想通过属性注入的方式来获取我们注入的对象,对不起,有时候你还真是获取不到,这因为什么呢? 1.你对Autofac 不 ...
- Autofac中的属性注入功能使用
使用依赖注入容器时,大部分都是使用构造函数来注入或者是xml配置文件.也有很多支持属性注入.Autofac就是其中一个. 1 为什么要有属性注入? 对于一些使用特频繁的类或者方法,很多类都会用到,那么 ...
- Autofac 的属性注入方式
介绍 该篇文章通过一个简单的 ASP.NET MVC 项目进行介绍如何使用 autofac 及 autofac 的 MVC 模块进行依赖注入.注入方式通过构造函数.在编写 aufofac 的依赖注入代 ...
- WebAPI2使用Autofac实现IOC属性注入完美解决方案
一.前言 只要你是.NETer你一定IOC,IOC里面你也会一定知道Autofac,上次说了在MVC5实现属性注入,今天实现在WebApi2实现属性注入,顺便说一下autofac的程序集的注入方式,都 ...
- Asp.Net MVC 之 Autofac 初步使用2 集成mvc 属性注入以及自动注入
首先看下Demo2的结构 然后下面一步步将Autofac集成到mvc中. 首先,定义Model Product.cs public class Product { public int Id ...
- ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)
前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...
- .NET领域最为流行的IOC框架之一Autofac WebAPI2使用Autofac实现IOC属性注入完美解决方案 AutoFac容器初步
.NET领域最为流行的IOC框架之一Autofac 一.前言 Autofac是.NET领域最为流行的IOC框架之一,微软的Orchad开源程序使用的就是Autofac,Nopcommerce开源程 ...
随机推荐
- Jquery的点击事件,三句代码完成全选事件
先来看一下Js和Jquery的点击事件 举两个简单的例子 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...
- 对抗密码破解 —— Web 前端慢 Hash
(更新:https://www.cnblogs.com/index-html/p/frontend_kdf.html ) 0x00 前言 天下武功,唯快不破.但在密码学中则不同.算法越快,越容易破. ...
- Ajax 概念 分析 举例
Ajax是结合了访问数据库,数据访问,Jquery 可以做页面局部刷新或者说是页面不刷新,我可以让页面不刷新,仅仅是数据的刷新,没有频繁的刷页面,是现在比较常用的一种方式做页面那么它是怎么实现页面无刷 ...
- 如何创建Vim Dotfile?
Dotfile是电脑系统里的隐藏文件,它是专门给更高级的用户,如开发者.程序员或工程师使用的,让他们用来调整系统.如何创建Vim-Dotfile? 可以参考以下步骤: 1. 首先,你要检查一下.vim ...
- .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整(续)-使用配置文件动态注入
上次实现了依赖注入,但是web项目必须要引用业务逻辑层和数据存储层的实现,项目解耦并不完全:另一方面,要同时注入业务逻辑层和数据访问层,注入的服务直接写在Startup中显得非常臃肿.理想的方式是,w ...
- MVC如何使用开源分页插件shenniu.pager.js
最近比较忙,前期忙公司手机端接口项目,各种开发+调试+发布现在几乎上线无问题了:虽然公司项目忙不过在期间抽空做了两件个人觉得有意义的事情,一者使用aspnetcore开发了个人线上项目(要说线上其实只 ...
- UE4新手引导之下载和安装虚幻4游戏引擎
1) 进入虚幻4的官方主页(https://www.unrealengine.com/) 这里你可以获得关于虚幻4的最新资讯,包括版本更新.博客更新.新闻和商城等.自2015年起,该引擎已经提供免费下 ...
- 一个表缺失索引发的CPU资源瓶颈案例
背景 近几日,公司的应用团队反应业务系统突然变慢了,之前是一直比较正常.后与业务部门沟通了解详情,得知最近生意比较好,同时也在做大的促销活动,使得业务数据处理的量出现较大的增长,最终系统在处理时出现瓶 ...
- mysql进阶之存储过程
往往看别人的代码会有这样的感慨: 看不懂 理还乱 是离愁 别是一番滋味在心头 为什么要使用存储过程? 在mysql开发中使用存储过程的理由: 当希望在不同的应用程序或平台上执行相同的函数,或者封装特定 ...
- 写出易调试的SQL
h4 { background: #698B22 !important; color: #FFFFFF; font-family: "微软雅黑", "宋体", ...