Autofac - 设置依赖注入的基本解释

时间:2014-07-31 09:32:59

标签: asp.net dependency-injection autofac

所以我正在尝试将Autofac设置到我自己的ASP.Net网络项目中。我已经修改了已经设置了依赖注入的现有ASP.Net项目,所以我想学习如何从头开始设置项目。我问朋友怎么做,他给了我代码。

这绝对是太棒了,因为我知道它会起作用。然而,它很糟糕 - 因为 - 我在Autofac网站上找到的教程 - 它没有解释太多(我更多的是一个图片详细的人,我讨厌单词问题。我必须想象它!)

所以,这是有效的代码。

// Create your builder.
1 var builder = new ContainerBuilder();
2 builder.RegisterControllers(typeof(MvcApplication).Assembly);

3 builder.RegisterModelBinders(Assembly.GetExecutingAssembly());
4 builder.RegisterModelBinderProvider();
5 builder.RegisterModule(new AutofacWebTypesModule());
6 builder.RegisterSource(new ViewRegistrationSource());

// assign interfaces here to the container so that it knows how to resolve requests
7  builder.RegisterType<foo>().As<ifoo>().InstancePerHttpRequest();

// create container
8 var container = builder.Build();
9 DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

有人可以向我解释 - 按命令命令 - 每一步做什么?我知道依赖注入的作用......中央源创建/分发用于控制器和模型的接口,而不需要自己创建每个实例的控制器/模型。但了解主干是如何运作的,这很好。

这是我到目前为止所拥有的:

1)创建说明列表,让我们说一步一步的配方

2)添加到食谱'识别网络应用程序控制器',以便您可以根据需要调用控制器。例如,FooController需要来自BarController的东西,解析BarController

3) - 6)不知道

7)点击配方,将“ifoo”接口添加到混音中;它的生命周期存在于每个请求中。不要再坚持了;基本上为每个动作发送一个新的

8)完成食谱说明。实际上按照说明将结果放入一个巨大的碗里。

9)告诉应用程序存在这一大碗好吃的东西。除非你从碗里拿出东西,它实际上是放入的东西的副本。因此,无穷无尽的好吃。

1 个答案:

答案 0 :(得分:2)

3)此扩展方法类似于RegisterControllers - 它从给定的程序集中注册所有模型绑定程序。模型绑定器是实现IModelBinder接口的类。它们的目的是将从请求传入的数据映射到控制器操作接受的模型。有关详细信息,请参阅此处的示例:http://www.codeproject.com/Articles/605595/ASP-NET-MVC-Custom-Model-Binder

4)RegisterModelBinderProvider注册AutofacModelBinderProvider - 由于它,您在RegisterModelBinders注册的模型绑定器将自动应用于您的应用程序。

5)RegisterModule注册autofac模块 - 一个派生自Module类的类。通常在其中,您可以覆盖Load方法,您可以在其中存储其他autofac注册内容。可以在此处找到AutofacWebTypesModule代码:https://code.google.com/p/autofac/source/browse/src/Source/Autofac.Integration.Web.Mvc3/AutofacWebTypesModule.cs?r=94f70ab10f4d65991c600e2e80171ce4847589e6 它注册包装HttpContext.Current的类。由于HttpContext是静态的,因此不能在单元测试中进行模拟,因此自动测试是有问题的。 AutofacWebTypesModule可以帮助您克服这个问题。

6)RegisterSource允许您注册新的来源。它们与服务查找模式非常相似。多亏了它们,您可以解决某些未在autofac中明确注册的事情(比如您可以注册ISomeInterface类型的对象,然后解析Owned而不显式注册它)。您可以在此处详细了解:http://nblumhardt.com/2010/01/declarative-context-adapters-autofac2/。 ViewRegistrationSource代码在此处显示:https://code.google.com/p/autofac/source/browse/src/Source/Autofac.Integration.Mvc/ViewRegistrationSource.cs?r=8974cef867b5b2f2876a8c71037014424bd87aba正如其中所述,其目的是允许您解析WebViewPage,ViewPage,ViewMasterPage和ViewUserControl。您可以在cshtml文件中定义视图,但您也可以将它们定义为WebViewPage类 - 然后可以在许多程序集中共享它们 - 但cshtml不能。 RazorGenerator工具可以为您的cshtml视图生成WebViewPage类。感谢ViewRegistrationSource,你可以在一些程序集中定义WebViewPage HomeView.cs,然后不用autofac注册它就像解决context.Resolve()并从动作返回一样。

关于这些主题的更多好读物:https://code.google.com/p/autofac/source/browse/Mvc3Integration.wiki?repo=wiki&r=7393a4178bea525f783cef91e206fbdc3921411a