autoface -设置依赖注入的基本说明



所以我试图将autoface设置为我自己的ASP。净web项目。我修改了现有的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)添加到recipe 'recognize the web-app controllers',这样你就可以在需要的时候调用一个控制器。例如,FooController需要一些来自BarController的东西,resolve BarController

3) - 6)不知道

7)放上配方,加入接口'ifoo'到混合物中;它的生命周期存在于每个请求中。不要超过这个时间;为每个动作发送一个新的

8)完成配方说明。按照指示,把结果放进一个大碗里。

9)告诉应用程序这个大碗在哪里。除了当你从碗里拿东西时,它实际上是放进去的东西的复制品。因此,源源不断的好东西。

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

4) RegisterModelBinderProvider注册AutofacModelBinderProvider -多亏了它,注册在registermodelbinder上的模型binder将自动应用于你的应用程序。

5) RegisterModule注册autofac模块——一个派生自module类的类。通常在它里面你重写Load方法,你可以在其中存储额外的自动注册的东西。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允许你注册新的source。它们的工作方式与服务查找模式非常相似。多亏了它们,你可以解决某些没有在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,然后不用注册它就像autoface一样解析它,比如context.Resolve()和从action返回。

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

最新更新