也说Autofac在MVC的简单实践:破解在Controller构造函数中的实例化 - winhu

相信大家对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的单实例也基本不会考虑。

时间: 2024-11-05 02:29:11

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

对IOC模式与容器Autofac在MVC里面的一些用法

IOC模式与Autofac的实例 一:对于IOC模式(控制翻转)的简单认识可以去参考秋风的博客,他介绍的容器是Unity,http://www.cnblogs.com/qqlin/archive/2012/10/09/2707075.html 二:下面我介绍一下在项目中对IOC模式与Autofac在MVC中的运用 1:用于我们公司数据库用的是pg,所以相应也使用了NHibernate,如果大家使用的数据库是SQL Server,相当于EF 首先定义数据访问的接口: 1 public interf

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

之前在园子闲逛的时候,发现许多关于automapper的文章,以及用aotufac+automapper合在一起用.当然发现大多数文章是将automapper的特点说出或将automapper几处关键代码放出.当然有过基础的人看这种文章没有什么问题,但是对于完全没有基础的小白来看完全是灾难级别的(我就是),经常按着博文一点一点的写,突然发现少了一部分导致代码无法运行.在搜索各种文章之后,终于用自己的理解写出了一个简单的运用automapper的demo,日后待我对automapper理解加深会进

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

原文:http://www.cnblogs.com/sonykings/archive/2013/05/30/3107531.html ASP.NET MVC最佳实践 本文档提供了一套旨在帮助创建最佳优化ASP.NET MVC应用程序的 开发人员编码准则. 当然,由您来选择这些优化准则. 模型的建议 Model是定义业务领域相关的对象,应该包含业务逻辑(对象如何动作和关联),验证逻辑(验证对象的有效值),数据逻辑(数据对象如何持久化),和会话逻辑(跟踪用户状态). 创建独立的Model项目,在A

【转】ASP.NET MVC 的最佳实践

[这个职位基于创作的本 · 格罗弗 (在 Microsoft 高级开发人员) 的文档. 它是我们打算将此信息集成到 MSDN 上的 MVC 3 文档. 我们希望你的来信和欢迎您可能提出的任何建议.] 本文档提供了一套旨在帮助创建坚实的应用程序的 ASP.NET MVC 开发人员的编码准则. 当然,它是您作为决定,这些准则是适合您的应用程序开发人员. 模型的建议 该模型是用于定义特定于域的对象. 这些定义应包括业务逻辑 (如何对象的行为和涉及). (什么是有效的值为给定的对象) 的验证逻辑. (如

ASP.NET MVC 的最佳实践

[这个职位基于创作的本 · 格罗弗 (在 Microsoft 高级开发人员) 的文档. 它是我们打算将此信息集成到 MSDN 上的 MVC 3 文档. 我们希望你的来信和欢迎您可能提出的任何建议.] 本文档提供了一套旨在帮助创建坚实的应用程序的 ASP.NET MVC 开发人员的编码准则. 当然,它是您作为决定,这些准则是适合您的应用程序开发人员. 模型的建议 该模型是用于定义特定于域的对象. 这些定义应包括业务逻辑 (如何对象的行为和涉及). (什么是有效的值为给定的对象) 的验证逻辑. (如

(转)JAVA AJAX教程第四章—AJAX和MVC的简单结合

这里我们再理解了AJAX后,开始来用实例感受AJAX的力量. 今天我最后要实现的效果,当鼠标放到图片上时会根据,会把数据库库里的数据读出,通过显示框显示出来.这个在很多网上商店都有用到这里效果,我们这里用AJAX来实现这个效果.这个实例里结合了MySql.Servlet还有Js,理论性很少,但通过实践来感受理论知识. 一个页面中应用了 AJAX,同时他也能实现MVC框架,可以吗?当然可以的.通过页面调用AJAX,这个页面就是MVC中的V,他用来前台显示与用户交互的内容.用 JavaBean作为M

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

在你阅读时,默认已经了解IOC和autofac的基本用法, 我在最近的我的博客项目中运用了IOC autofac 实现了依赖注入 由于我的项目时asp.net MVC所以我目前向大家展示MVC中如何使用autofac 首先在app_start中新建一个类包含以下方法 using System.Reflection; using Autofac; using Autofac.Integration.Mvc; using System.Web.Mvc; using Microsoft.Extensi

MVC与单元测试实践之健身网站(二)-管理员模块

开始动手做这个项目时,发现无法做到完全的先设计.再编码,于是决定分模块进行,从管理员模块开始设计.编码,而且接口就已经改了好几次了. 管理员模块涉及的功能有登录和后台对管理员的维护,其中也涉及前端的开发.UI模板使用Inspinia,感觉这套模板功能丰富.界面美观,而且基于HTML5和BootStrap,对这两方面的知识也可以多些了解. 在上一篇<如何在单元测试时隔离ORM>中,解决了对Service层进行测试怎样构建伪对象的问题,随后管理员模块的Service层和单元测试在齐头并进中完成了:

用Spring MVC开发简单的Web应用

这个例子是来自于Gary Mak等人写的Spring攻略(第二版)第八章Spring @MVC中的一个例子,在此以学习为目的进行记录. 问题:想用Spring MVC开发一个简单的Web应用, 学习这个框架的基本概念和配置. 解决方案: Spring MVC的核心组件是一个控制器(大多数框架都是控制器比较重要吧). 在最简单的Spring MVC应用中,控制器是需要在web.xml文件中配置的唯一Servlet. Spring MVC的控制器通常称作请求分发Servlet(Dispatcher