如何在基本的MVC5.1网站中正确注册AutoFac?

AutoFac最近已针对MVC 5.1进行了更新,但在撰写本文时,我发现缺少文档(特别是对于一个简单的示例)。

我想将依赖项注入MVC​​控制器并注册我自己的实现,例如电子邮件(实际发送与打印到输出窗口)作为基本示例。

我不知道我是否遗漏了一个很好的资源,我有点担心,因为它使用OWIN规范,实现可能与MVC5.1不同(ASP.NET身份使用OWIN并且使用了一些特殊属性正确实例化OWIN)所以需要检查我是否正确。

我有一个使用以下设置代码的工作示例 – 对于标准MVC5.1 Web应用程序,这是正确和良好的做法吗?

额外问题:我是否需要将InstancePerHttpRequest添加到RegisterControllers行? 即builder.RegisterControllers(typeof(MvcApplication).Assembly).InstancePerHttpRequest();

(注意:我在Autofac上看到GitHub上的示例,但找不到适合MVC5.1的简单示例。)

public static void RegisterDependencies() { // Register MVC-related dependencies var builder = new ContainerBuilder(); builder.RegisterControllers(typeof(MvcApplication).Assembly); builder.RegisterModelBinders(typeof(MvcApplication).Assembly); builder.RegisterModule(); // Register e-mail service builder.RegisterType().As().InstancePerHttpRequest(); builder.RegisterModelBinderProvider(); // Set the MVC dependency resolver to use Autofac var container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); } 

而我的控制器:

 public class HomeController : Controller { public IEmailSender _email { get; set; } public HomeController(IEmailSender es) { this._email = es; } // // GET: /Home/ public ActionResult Index() { Email e = new Email(); e.To(new MailAddress("something@something.com", "mr. something")); e.Subject("test"); e.Message("hello world"); e.From(new MailAddress("somethingElse@somethingElse.com", "mr. else")); this._email.SendEmail(e); return View(); } } 

谢谢!

这就是我所拥有的 – 反馈欢迎!

的Global.asax.cs:

 public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { // Register Inversion of Control dependencies IoCConfig.RegisterDependencies(); // Typical MVC setup // .... } } 

App_Start文件夹:

 public class IoCConfig { ///  /// For more info see /// :https://code.google.com/p/autofac/wiki/MvcIntegration (mvc4 instructions) ///  public static void RegisterDependencies() { #region Create the builder var builder = new ContainerBuilder(); #endregion #region Setup a common pattern // placed here before RegisterControllers as last one wins builder.RegisterAssemblyTypes() .Where(t => t.Name.EndsWith("Repository")) .AsImplementedInterfaces() .InstancePerHttpRequest(); builder.RegisterAssemblyTypes() .Where(t => t.Name.EndsWith("Service")) .AsImplementedInterfaces() .InstancePerHttpRequest(); #endregion #region Register all controllers for the assembly // Note that ASP.NET MVC requests controllers by their concrete types, // so registering them As() is incorrect. // Also, if you register controllers manually and choose to specify // lifetimes, you must register them as InstancePerDependency() or // InstancePerHttpRequest() - ASP.NET MVC will throw an exception if // you try to reuse a controller instance for multiple requests. builder.RegisterControllers(typeof(MvcApplication).Assembly) .InstancePerHttpRequest(); #endregion #region Register modules builder.RegisterAssemblyModules(typeof(MvcApplication).Assembly); #endregion #region Model binder providers - excluded - not sure if need //builder.RegisterModelBinders(Assembly.GetExecutingAssembly()); //builder.RegisterModelBinderProvider(); #endregion #region Inject HTTP Abstractions /* The MVC Integration includes an Autofac module that will add HTTP request lifetime scoped registrations for the HTTP abstraction classes. The following abstract classes are included: -- HttpContextBase -- HttpRequestBase -- HttpResponseBase -- HttpServerUtilityBase -- HttpSessionStateBase -- HttpApplicationStateBase -- HttpBrowserCapabilitiesBase -- HttpCachePolicyBase -- VirtualPathProvider To use these abstractions add the AutofacWebTypesModule to the container using the standard RegisterModule method. */ builder.RegisterModule(); #endregion #region Set the MVC dependency resolver to use Autofac var container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); #endregion } } 

然后你可以按照你认为合适的方式注册模块,如果你有一个模块化的应用程序并且你不知道你将在项目中包含什么,这真的很棒。 你可以设置你的项目,不需要人工干预(我希望!)….

 public class RegisterApplicationIoC : Module { protected override void Load(ContainerBuilder builder) { builder.RegisterType() .As() .InstancePerHttpRequest(); } }