分享

Autofac入门

 ThinkTank_引擎 2015-06-15

说到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的步骤:

  • 第一步,定义一个Container容器。
  • 第二步,创建builder,并在builder中注册类型。
  • 第三步,实例化容器(可以讲第一步合并进来)。
  • 第四步,在需要使用接口的地方,通过container来解析得到一个借口的实例。

这里只是针对上面的代码进行的总结。

在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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多