相信大家对Autofac并不陌生,很多人都在使用。本文只是介绍一下本人在使用时的一点想法总结。

在使用一个框架时,肯定要去它的官网查阅一下。autofac的官网给出了一些经典的使用案例。如注册容器:

var builder = new ContainerBuilder();

// Register individual components
builder.RegisterInstance(new TaskRepository)
.As<ITaskRepository>();
builder.RegisterType<TaskController>();
builder.Register(c => new LogManager(DateTime.Now))
.As<ILogger>(); // Scan an assembly for components
builder.RegisterAssemblyTypes(myAssembly)
.Where(t => t.Name.EndsWith("Repository"))
.AsImplementedInterfaces(); var container = builder.Build();
public class TaskController
{
private ITaskRepository _repository;
private ILogger _logger; // Autofac will automatically find the registered
// values and pass them in for you.
public TaskController(
ITaskRepository repository,
ILogger logger)
{
this._repository = repository;
this._logger = logger;
}
}

在这里先重点说一下在mvc中的使用,如上代码可见,在一个请求到达时,需要对controller进行实例化,而正如autofac官网所说“ If there is more than one constructor on a component type, Autofac will use the constructor with the most resolvable parameters. ”,如果有多个带参构造函数,autofac默认使用参数最多的构造函数。在上面代码中,即便在一个action中,你只用了_ logger ,那么_ repository 也依旧需要被autofac解析。

而在mvc的具体应用中,我们可能会使用多重继承,如下图的结构

在这种情况下,每个controller可能会有很多构造函数,在每个请求到达时,都需要实例化相当一部分的变量。本人没有研究过这种实例化是否会影响效率,只是觉得这样对于开发来讲过于繁琐,且不利于维护,代码也并不流畅。我的想法是在action中,在需要的点去实例化。

经过一些查阅,autofac官方提供了很多库,发现其中Autofac.Mef是可以用另一种方式实现达到同样的效果。文档的介绍只有一句话“ The MEF integration allows you to expose extensibility points in your Autofac applications using the   Managed Extensibility Framework . ”  mef可能主要用来在对已经开发完毕的版本做补充的时候使用。如某个系统已经开发结束并部署运行了,这时候会有些功能的增加和扩展,在不修改原版本的前提下,使用mef可以将后补充的功能ioc到原系统。mef需要引用ystem.ComponentModel.Composition.dll 库。

先不说别的了,代码说明一切。在接口实现上需要加入ExportAttribute,如:

[Export(typeof(ICustomerBusiService))]
public class CustomerBusiService : ICustomerBusiService

注意,ICustomerBusiService不用做任何的描述,只描述其实现CustomerBusiService即可。为了达到我的目的,我在顶层的controller中增加了一个获取实例的方法,以便action中根据自己的需要获取实例化:

public abstract class AbstractController : Controller
{
private static IAutofacResolver _resolver = new AutofacResolver();
protected T GetService<T>()
{
return _resolver.GetService<T>();
}
}
下面展示一下IAutofacResolver及其实现AutofacResolver
public interface IAutofacResolver
{
T GetService<T>();
} public class AutofacResolver : IAutofacResolver
{
private Autofac.IContainer _container; public T GetService<T>()
{
if (_container == null || !_container.IsRegistered<T>())
{
RegisterPartsFromReferencedAssemblies();
}
return _container.Resolve<T>();
} private void RegisterPartsFromReferencedAssemblies()
{
var asses = BuildManager.GetReferencedAssemblies().Cast<Assembly>();
var assemblyCatalogs = asses.Select(x => new AssemblyCatalog(x));
var catalog = new AggregateCatalog(assemblyCatalogs); var builder = new ContainerBuilder();
builder.RegisterComposablePartCatalog(catalog);
_container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(_container));
}
}

有了这样一个结构,那么在具体的controller中我不需要有构造函数,在acton中只要调用GetService<T>()就可以获取我需要的实例。

public class AccountController : AbstractMvcController
{
[HttpPost]
public ActionResult Register(Customer customer)
{
var ibsCusomter = GetService<ICustomerBusiService>();
ibsCusomter.Register(customer);
return View();
}
}

以上就是全部内容。本文并没有针对复杂的autofac应用进行说明,比如注册复杂的模型,激活事件等。只是对比较简单普遍的autofac的使用进行一些分析,个人认为mvc的站点开发中,不太会用到比较复杂的东西,因为每个用户请求都是独立的,又有并发的问题,所以autofac的单实例也基本不会考虑。

也说Autofac在MVC的简单实践:破解在Controller构造函数中的实例化 - winhu的更多相关文章

  1. ioc初步理解(二) 简单实用autofac搭建mvc三层+automapper=》ioc(codeFirst)

    之前在园子闲逛的时候,发现许多关于automapper的文章,以及用aotufac+automapper合在一起用.当然发现大多数文章是将automapper的特点说出或将automapper几处关键 ...

  2. 记一次autofac+dapper+mvc的框架搭建实践

    1,环境 .net framework4.7.2,Autofac,Autofac.Mvc5,sql server 2,动机 公司项目用的是ef,之前留下代码的大哥,到处using,代码没有分层,连复用 ...

  3. [转]ASP.NET MVC 4 最佳实践宝典

    原文:http://www.cnblogs.com/sonykings/archive/2013/05/30/3107531.html ASP.NET MVC最佳实践 本文档提供了一套旨在帮助创建最佳 ...

  4. IOC容器-Autofac在MVC中实现json方式注入使用

    在你阅读时,默认已经了解IOC和autofac的基本用法, 我在最近的我的博客项目中运用了IOC autofac 实现了依赖注入 由于我的项目时asp.net MVC所以我目前向大家展示MVC中如何使 ...

  5. 【半小时大话.net依赖注入】(下)详解AutoFac+实战Mvc、Api以及.NET Core的依赖注入

    系列目录 上|理论基础+实战控制台程序实现AutoFac注入 下|详解AutoFac+实战Mvc.Api以及.NET Core的依赖注入 前言 本来计划是五篇文章的,每章发个半小时随便翻翻就能懂,但是 ...

  6. Thrift简单实践

    0.什么是RPC RPC(Remote Procedure Call - 远程过程调用),是通过网络从远程计算机上请求服务,而不需要了解底层网路技术的细节.简单点说,就是像调用本地服务(方法)一样调用 ...

  7. Autofac.Integration.Mvc分析

    Autofac.Integration.Mvc static ILifetimeScope LifetimeScope { get { return (ILifetimeScope)HttpConte ...

  8. Java 异步处理简单实践

    Java 异步处理简单实践 http://www.cnblogs.com/fangfan/p/4047932.html 同步与异步 通常同步意味着一个任务的某个处理过程会对多个线程在用串行化处理,而异 ...

  9. [Solution] 使用Autofac在MVC、Web API、WCF中实现IOC

    本来想聊一下面试过程的,1个星期面了6家,4家当场给offer,2家技术通过(1家没下文,1家复试).从中也学习到一些东西,先还是继续Coding吧. 官网:http://autofac.org/ 下 ...

随机推荐

  1. C# 知识笔记

    HttpContext.Request.Form.ToString() 获取Form表单中的内容 /// <summary> /// 获取 GET 提交方式值 /// </summa ...

  2. java基础知识回顾之java Thread类学习(七)--java多线程通信等待唤醒机制(wait和notify,notifyAll)

    1.wait和notify,notifyAll: wait和notify,notifyAll是Object类方法,因为等待和唤醒必须是同一个锁,不可以对不同锁中的线程进行唤醒,而锁可以是任意对象,所以 ...

  3. WAF安恒

    http://wenku.baidu.com/view/c242927f581b6bd97e19ea1a.html?from=search

  4. POJ2418Hardwood Species

    题意 : 输入若干个树木品种,里边有的是重复的,让你统计每个品种占输入的总数量的百分比,最后按字典序输出 思路 : 本题数量很大,所以采用直接统计的方式会超时,而采用的方法可以用二叉搜索树,或者用ma ...

  5. @QueryParam和@PathParam比较

    来源:http://jackyrong.iteye.com/blog/1128364 1 先来看@queryparam Path("/users") public class Us ...

  6. 【Linux高频命令专题(5)】rmdir

    简述 rmdir是常用的命令,该命令的功能是删除空目录,一个目录被删除之前必须是空的.(注意,rm - r dir命令可代替rmdir,但是有很大危险性.)删除某目录时也必须具有对父目录的写权限. 命 ...

  7. SULogger:iOS日志可视化工具

    前言 debug对于咋们程序员来说家常便饭,但有时候我们会遇到一种情况:开发某个功能时,需要在某个特定场景下进行调试,而这个场景并没有MacBook来进行连接debug,偏偏我们需要获得调试时的一些信 ...

  8. 利用BBRSACryptor实现iOS端的RSA加解密

    背景 RSA这种非对称加密被广泛的运用于网络数据的传输,但其在iOS上很难直接实现,BBRSACryptor框架通过移植openssl实现了iOS端的RSA,本文将介绍如何使用BBRSACryptor ...

  9. Python中的两种结构dict和set

    Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度. 假设要根据同学的名字查找对应的成绩 如果 ...

  10. QTP之对测试用例的自动化过程的分解

    第一部分:自动化一个测试用例 当你要开始自动化一个测试用例的时候,有一些重要的事情需要完成.当你完成所有这些事情的时候,测试脚本的自动化也随之完成. 在这里,我们将首先在大部分的自动化测试用例里找出所 ...