说到Autofac,我们就要首先了解依赖注入(Dependency Injection,简称DI)。DI不是什么技术,而是一种设计模式,是用来降低计算机程序之间的耦合的。在.net平台,有很多依赖注入工具,Autofac是一款较为轻量级的、性能优异的、支持xml配置的依赖注入工具,这也是为什么我选用Autofac的原因。 简单示例要使用Autofac,首先我们需要在项目中引用。现在比较方便的方法是通过Nuget进行管理: install-package autofac 上面的命令可以将autofac添加到你的项目中。 接下来开始这个示例的代码。在第一步,我们先来完成一个接口: public interface ILog { int Id { get; set; } void Write(); } 然后实现这个接口: public class DatabaseLog : ILog { #region ILog 成员 public int Id { get; set; } public void Write() { Console.WriteLine("Id:" + Id + " Log to database..."); } #endregion } 接下来该Autofac出场了,我们在Program.cs中需要用到ILog的一个实例: class Program { private static IContainer Container { get; set; } static void Main(string[] args) { var builder = new ContainerBuilder(); builder.RegisterType<DatabaseLog>().As<ILog>(); Container = builder.Build(); ILog log = Container.Resolve<ILog>(); log.Id = 1; log.Write(); } } 这就是我们使用Autofac的步骤:
这里只是针对上面的代码进行的总结。 在ASP.NET MVC中的用法在ASP.NET MVC中使用Autofac的时候,我们需要针对不同版本的MVC引入不同的Integration。 然后,我们需要初始化Autofac,当然,这种初始化过程只需要一次,我们把初始化代码放在Global中: var builder = new ContainerBuilder(); builder.RegisterControllers(typeof(MvcApplication).Assembly); //builder.Register(c => new VisitorRepository()).As<IVisitorRepository>().InstancePerHttpRequest(); builder.RegisterType<VisitorRepository>().As<IVisitorRepository>().InstancePerRequest(); ; builder.RegisterFilterProvider(); var container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 首先我们创建了Builder,然后注册了Controller,然后又注册了接口的实现,然后创建container。 最后,我们设置了MVC的依赖解析器。 通过这些设置,我们可以在ASP.NET MVC Controller中使用构造函数注入: public class HomeController : Controller { public IVisitorRepository Repository { get; set; } public HomeController(IVisitorRepository repository) { this.Repository = repository; } 在这段代码中,系统会为我们自动解析IVisitorRepository的具体实现。 在全局Filter中的用法对于非全局Filter,我们可以轻松的搞定依赖注入: builder.RegisterFilterProvider(); 而对于全局的Filter,这样的注册是不管用的。我们需要使用下面的代码进行处理: public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); //这里使用了Autofac容器来实例化Filter对象,然后添加到Global Filter中 filters.Add(DependencyResolver.Current.GetService<VisitorAdditionFilter>()); } } 总结Autofac的用法远不止这些,这里面提到的只是我用到的一些内容。 Autofac的学习资源:https://github.com/autofac/Autofac/wiki |
|
来自: ThinkTank_引擎 > 《Autofac》