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开源程 ...
随机推荐
- In-Memory:内存数据库
在逝去的2016后半年,由于项目需要支持数据的快速更新和多用户的高并发负载,我试水SQL Server 2016的In-Memory OLTP,创建内存数据库实现项目的负载需求,现在项目接近尾声,系统 ...
- .NET跨平台之旅:将示例站点升级至 ASP.NET Core 1.1
微软今天在 Connect(); // 2016 上发布了 .NET Core 1.1 ,ASP.NET Core 1.1 以及 Entity Framework Core 1.1.紧跟这次发布,我们 ...
- Android 获取meta-data中的数据
在 Android 的 Mainfest 清单文件中,Application,Activity,Recriver,Service 的节点中都有这个的存在.很多时候我们可以通过 meta-data 来配 ...
- 第一个shell脚本
打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好. #!/bin/bash echo "Hello World !" &quo ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(63)-Excel导入和导出-自定义表模导入
系列目录 前言 上一节使用了LinqToExcel和CloseXML对Excel表进行导入和导出的简单操作,大家可以跳转到上一节查看: ASP.NET MVC5+EF6+EasyUI 后台管理系统(6 ...
- Web APi之认证(Authentication)两种实现方式【二】(十三)
前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再叙述废话. 序言 对于所谓的认证说到底 ...
- php注册审核
通过注册审核,判断刚创建的账户是否可以使用. 后台管理员审核通过后,账号可以使用. 通过session 设置只能通过登录入口进入网页. 原理:通过数据库设置账号的一个字段状态,例: isok:1, i ...
- Jqprint实现页面打印
好些项目需要实现页面打印,特别是一些后台管理类系统,下面介绍一款轻量级的打印插件: 1.实现页面打印要引入jQuery和Jqprint.点击下载Jqprint插件 <script languag ...
- 5.0 JS中引用类型介绍
其实,在前面的"js的六大数据类型"文章中稍微说了一下引用类型.前面我们说到js中有六大数据类型(五种基本数据类型 + 一种引用类型).下面的章节中,我们将详细讲解引用类型. 1. ...
- document.compatMode
在我电脑屏幕上显示的 电脑是 1920*1080这是在document.compatMode:css1Compat模式 window.screen.availWidth 1920 window.scr ...