介绍

该篇文章通过一个简单的 ASP.NET MVC 项目进行介绍如何使用 autofac 及 autofac 的 MVC 模块进行依赖注入。注入方式通过构造函数。在编写 aufofac 的依赖注入代码之前先准备一些基础类。

基础类

public class UserInfo
{
public int Id { get; set; } public string Name { get; set; }
}
public interface IRepository<T>
{
void Add( T item ); void Modifty( T item ); List<T> Find( Expression<Func<T, bool>> predicate = null );
}
public interface IProductRepository:IRepository<ProductInfo>
{ }
public class ProductRepository : IProductRepository
{
private static List<ProductInfo> _products = new List<ProductInfo>(); public void Add( ProductInfo item )
{
_products.Add( item );
} public List<ProductInfo> Find( Expression<Func<ProductInfo, bool>> predicate = null )
{
if ( predicate == null ) return _products; return _products.Where( predicate.Compile() ).ToList();
} public void Modifty( ProductInfo item )
{
var product = _products.Find( u => u.Id == item.Id ); if ( product == null ) return; product.Name = item.Name;
}
}
public interface IAppService<T>
{
void Add( T item ); void Modify( T item ); List<T> Find( Expression<Func<T, bool>> predicate = null );
}
public interface IProductAppService:IAppService<ProductInfo>
{ }
public class ProductAppService : IProductAppService
{
public IProductRepository ProductRepository { get; set; } public void Add( ProductInfo item )
{
this.ProductRepository.Add( item );
} public List<ProductInfo> Find( Expression<Func<ProductInfo, bool>> predicate = null )
{
return this.ProductRepository.Find( predicate );
} public void Modify( ProductInfo item )
{
this.ProductRepository.Modifty( item );
}
}
public class ProductController : Controller
{
public IProductAppService ProductService { get; set; } public ActionResult Index()
{
this.ProductService.Add( new ProductInfo { Id = , Name = "Lumia" } ); return View("~/Views/Product/Index.cshtml");
}
}

属性注入代码

以下代码中 PropertiesAutowired() 方法就是实现了属性注入的核心,从单词字面意思就可以看出其用意。

private void _InitIoC()
{
var builder = new ContainerBuilder(); builder.RegisterControllers( typeof( MvcApplication ).Assembly )
.PropertiesAutowired();
builder.RegisterAssemblyTypes( typeof( MvcApplication ).Assembly )
.Where( t => (t.Name.EndsWith( "Repository" ) || t.Name.EndsWith("AppService")) && !t.IsAbstract )
//.InstancePerDependency() //每次都创建一个对象
//.SingleInstance() //每次都是同一个对象
//.InstancePerLifetimeScope() //同一个生命周期生成的对象是同一个
.InstancePerRequest() //单个 Web / HTTP / API 请求的范围内的组件的共享一个实例。仅可用于支持每个请求的依赖关系的整合(如MVC,Web API,Web Forms等)。
.AsImplementedInterfaces()
.PropertiesAutowired(); var container = builder.Build();
var resolver = new AutofacDependencyResolver( container, new StubLifetimeScopeProvider( container ) ); DependencyResolver.SetResolver( resolver );
}

其它

Autofac.dll 版本 3.4.0.0
Autofac.Integration.Mvc.dll 版本 3.3.4.215

Autofac 的属性注入方式的更多相关文章

  1. Autofac 的属性注入,IOC的坑

    Autofac 是一款优秀的IOC的开源工具,完美的适配.Net特性,但是有时候我们想通过属性注入的方式来获取我们注入的对象,对不起,有时候你还真是获取不到,这因为什么呢? 1.你对Autofac 不 ...

  2. 基于autofac的属性注入

    基于autofac的属性注入 什么是属性注入 在了解属性注入之前,要先了解一下DI(Dependency Injection),即依赖注入.在ASP.NET Core里自带了一个IOC容器,而且程序支 ...

  3. Autofac 的构造函数注入方式

    介绍 该篇文章通过一个简单的 ASP.NET MVC 项目进行介绍如何使用 autofac 及 autofac 的 MVC 模块进行依赖注入.注入方式通过构造函数. 在编写 aufofac 的依赖注入 ...

  4. ASP.NET Core中使用Autofac进行属性注入

    一些无关紧要的废话: 作为一名双修程序员(自封的),喜欢那种使用Spring的注解形式进行依赖注入或者Unity的特性形式进行依赖注入,当然,形式大同小异,但结果都是一样的,通过属性进行依赖注入. A ...

  5. TZ_11_Spring-Boot的属性注入方式(jdbc为例)

    1.以上一篇文档为基础 2.创建jdbc外部属性文件 application.properties此名字为默认文件名在使用是不需要使用 @Propertysource("classpath: ...

  6. spring的两种属性注入方式setter注入和构造器注入或者自动注入

    1.这里的属性自动注入,与注解配置bean是两回事.这里的自动注入,指的是bean属性的自动注入. bean属性自动注入,包括byNAme和ByType两码事. 2.所有的applicationCon ...

  7. spring属性注入方式

    一.使用有参构造注入属性 配置文件 constructor-arg标签是需注入属性的名字 User类 生成了User的有参构造函数 测试类 结果 打印出了name属性的值 二.使用set方法注入属性 ...

  8. .net core番外第2篇:Autofac的3种依赖注入方式(构造函数注入、属性注入和方法注入),以及在过滤器里面实现依赖注入

    本篇文章接前一篇,建议可以先看前篇文章,再看本文,会有更好的效果. 前一篇跳转链接:https://www.cnblogs.com/weskynet/p/15046999.html 正文: Autof ...

  9. WebAPI2使用Autofac实现IOC属性注入完美解决方案

    一.前言 只要你是.NETer你一定IOC,IOC里面你也会一定知道Autofac,上次说了在MVC5实现属性注入,今天实现在WebApi2实现属性注入,顺便说一下autofac的程序集的注入方式,都 ...

随机推荐

  1. Android应用程序“R文件”消失

    其实Android自己维护这一个 public final class R类主要是跟新资源文件,这个R.java无需我们自己去修改,如果你不了解千万不要去修改它,它定义的每个资源值都是唯一的,不会和系 ...

  2. 记录以下boost::shared_ptr的一个使用细节

    shared_ptr<T>::operator->返回的是T*类型指针,非const T*指针.因此通过const shared_ptr<T>&类型的ptr可以直 ...

  3. HTML5实现屏幕手势解锁

    HTML5实现屏幕手势解锁(转载) https://github.com/lvming6816077/H5lockHow to use? <script type="text/java ...

  4. c语言scanf返回值

    1. scanf 函数是有返回值的,它的返回值可以分成三种情况 1) 正整数,表示正确输入参数的个数.例如执行 scanf("%d %d", &a, &b); 如果 ...

  5. 移动平台对 meta 标签的定义

    一.meta 标签分两大部分:HTTP 标题信息(http-equiv)和页面描述信息(name). 1.http-equiv 属性的 Content-Type 值(显示字符集的设定) 说明:设定页面 ...

  6. 微信自定义菜单view类型获取openid访问网页

    用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的url值 (即网页链接),达到打开网页的目的,但是view不能获取用户的openid,需与网页授权获取用户基本信息接口结合使用,获得用 ...

  7. nginx相关配置说明

    基础: nginx配置文件主要分为六个区域:main section.events section.http section.sever section. location section.upstr ...

  8. [uboot]E9-i.MX6Q-uboot移植

      参照:http://blog.csdn.net/girlkoo/article/details/45420977 文档参照: <i.MX BSP Porting Guide-2015/12, ...

  9. 自动装箱(boxing)和自动拆箱(unboxing)

    摘自:http://www.codeceo.com/article/java-boxing-unboxing.html Java的四类八种基本数据类型 基本类型 占用空间(Byte) 表示范围 包装器 ...

  10. str转unsigned int

    用法 1 参数:参数类型为char, 十六进制字符串形式:0X××××××[NUT],十进制字符串形式:×××××××[NUT],字符串的最大长度为16,字符串结尾符必须为ascii码值0(NUT). ...