刚从 PHP 这种动态语言转移到 C# 这样静态语言的开发总是有些不适应,我在 PHP 里没有尝试过依赖注入框架,这次搞 ASP.NET 开发打算小试一番。
在这里,我采用了业界赫赫有名的 Autofac。
步骤如下:
- 使用 nuget 安装 Autofac
- 在 Application_Start 中初始化依赖注入框架
- 注册依赖
- 使用依赖注入,或者动态解析依赖
以我目前所做的 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 的内容欢迎查阅官方文档。