C# 在 ASP.NET 中使用依赖注入框架 Autofac 的简短入门

刚从 PHP 这种动态语言转移到 C# 这样静态语言的开发总是有些不适应,我在 PHP 里没有尝试过依赖注入框架,这次搞 ASP.NET 开发打算小试一番。

在这里,我采用了业界赫赫有名的 Autofac。

步骤如下:

  1. 使用 nuget 安装 Autofac
  2. 在 Application_Start 中初始化依赖注入框架
  3. 注册依赖
  4. 使用依赖注入,或者动态解析依赖

以我目前所做的 MVC 5 的项目为例。

安装 Autofac 和 Autofac.Mvc5。

然后,在 App_Start 文件夹下新建 IocConfig.cs,并在这里注册依赖和依赖解析器。

public class IocConfig {
    public static void RegisterDependencies(HttpApplicationState ApplicationState) {
        var builder = new ContainerBuilder();
        var assembly = Assembly.GetExecutingAssembly();
        builder.RegisterControllers(assembly);

        builder.RegisterType<MyDbContext>();
            
        builder.RegisterAssemblyTypes(assembly)
            .Where(t => t.Name.EndsWith("Service"))
            .AsImplementedInterfaces();

        var container = builder.Build();
        ApplicationState["container"] = container;
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
    }
}

先不要急着阅读上方的每一句代码,之后再说。

然后,在 Global.asax 文件里的 Application_Start() 尾部执行我们的代码。

protected void Application_Start() {
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);

    IocConfig.RegisterDependencies(Application);
}

此时我们就已经在使用 Autofac 了,怎么使用呢?

public class MyController : Controller {
    private MyDbContext dbContext;
    public MyController(MyDbContext dbContext) {
        this.dbContext = dbContext;
    }
}

当我们调用 MyController 下的 Action,在 ASP.NET 实例化 MyController 时 MyDbContext 将被自动实例化并作为参数传给 MyController 的构造函数,实现依赖注入。

为什么 MyDbContext 能被注入呢?因为我们将该依赖注册到了容器里,而且注册了持有这个容器的依赖解析器。

现在回头看看 RegisterDependencies() 的代码吧!更多关于依赖的 Register 和 Resolve 的内容欢迎查阅官方文档。

点赞