生活随笔
收集整理的這篇文章主要介紹了
ASP.NET MVC 5 使用autofac实现DI
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
使用Nuget添加Autofac.MVC的引用 啟動項設置 注冊Controller 注冊ModelBinder 注冊相關的web abstraction 為View層啟用屬性注入 為Action Filter啟用屬性注入 ?
???使用Nuget添加Autofac.MVC的引用 ???????
?啟動項設置 protected void Application_Start(){AreaRegistration.RegisterAllAreas();RouteConfig.RegisterRoutes(RouteTable.Routes);var builder = new ContainerBuilder();builder.RegisterType<BookService>().As<IBookService>();builder.RegisterType<Logger>().As<ILogger>();// Register your MVC controllers. (MvcApplication is the name of// the class in Global.asax.)builder.RegisterControllers(typeof(MvcApplication).Assembly);// OPTIONAL: Register model binders that require DI.builder.RegisterModelBinders(typeof(MvcApplication).Assembly);builder.RegisterModelBinderProvider();// OPTIONAL: Register web abstractions like HttpContextBase.builder.RegisterModule<AutofacWebTypesModule>();// OPTIONAL: Enable property injection in view pages.builder.RegisterSource(new ViewRegistrationSource());// OPTIONAL: Enable property injection into action filters.builder.RegisterFilterProvider();// Set the dependency resolver to be Autofac.var container = builder.Build();DependencyResolver.SetResolver(new AutofacDependencyResolver(container));}
?注冊Controller 注冊當前程序集下的所有Controller builder.RegisterControllers(typeof(MvcApplication).Assembly); 注冊單個Controller builder.RegisterType<HomeController>().InstancePerRequest(); ??注冊ModelBinder 在啟動項中注冊ModelBinder builder.RegisterModelBinders(typeof(MvcApplication).Assembly); builder.RegisterModelBinderProvider(); 自定義ModelBinder并且設置ModelBinderTypeAttribute [ModelBinderType(typeof(Book))]public class BookModelBinder : IModelBinder{public ILogger logger;public BookModelBinder(ILogger logger){this.logger = logger;}public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext){HttpRequestBase request = controllerContext.HttpContext.Request;string title = request.Form.Get("Title");string BookID = request.Form.Get("BookID");string day = request.Form.Get("Day");string month = request.Form.Get("Month");string year = request.Form.Get("Year");return new Book { BookID=BookID, Title=title+":DI Test"+this.logger.Log("dsa")+request.Form.Get("HttpRequestBaseDI"), Date=year+"-"+month+"-"+day };}}
?注冊相關的Web Abstract Class 啟動項設置 // OPTIONAL: Register web abstractions like HttpContextBase. ? builder.RegisterModule<AutofacWebTypesModule>();
實例(在ModelBinder中使用HttpRequestBase) [ModelBinderType(typeof(Book))]public class BookModelBinder : IModelBinder{ILogger logger;HttpRequestBase request1;public BookModelBinder(ILogger logger, HttpRequestBase request){this.logger = logger;this.request1 = request;}public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext){HttpRequestBase request = controllerContext.HttpContext.Request;request = request1;string title = request.Form.Get("Title");string BookID = request.Form.Get("BookID");string day = request.Form.Get("Day");string month = request.Form.Get("Month");string year = request.Form.Get("Year");return new Book { BookID=BookID, Title=title+":DI Test"+this.logger.Log("dsa")+request.Form.Get("HttpRequestBaseDI"), Date=year+"-"+month+"-"+day };}}
?在View層實現(xiàn)屬性注入 啟動項設置 builder.RegisterSource(new ViewRegistrationSource()); 實現(xiàn)自定義的ViewPage 這里的例子使用的是一個強類型的View,所以實現(xiàn)了一個泛型ViewPage
?public abstract class CustomViewPage<T> : WebViewPage<T> ??? { ??????? public ILogger Logger { get; set; } ??? }? View設置 @inherits MVC5Practices.Infrastructure.CustomViewPage<MVC5Practices.Infrastructure.Book>@{Layout = null;
}<!DOCTYPE html><html>
<head><meta name="viewport" content="width=device-width" /><title>ShowBook</title>
</head>
<body><div><h4>Book</h4><h5>@Logger.Log("dsa")</h5><hr /><dl class="dl-horizontal"><dt>@Html.DisplayNameFor(model => model.Title)</dt><dd>@Html.DisplayFor(model => model.Title)</dd><dt>@Html.DisplayNameFor(model => model.Date)</dt><dd>@Html.DisplayFor(model => model.Date)</dd></dl></div><p>@Html.ActionLink("Edit", "Edit", new { id = Model.BookID }) |@Html.ActionLink("Back to List", "Index")</p>
</body>
</html>
?為ActionFilter啟用屬性設置 啟動項設置 // OPTIONAL: Enable property injection into action filters. builder.RegisterFilterProvider();
自定義Filter public class CustomActionFilter : ActionFilterAttribute{public ILogger Logger { get; set; }public override void OnActionExecuting(ActionExecutingContext filterContext){Logger.Log("OnActionExecuting");}}
?
轉載于:https://www.cnblogs.com/LittleFeiHu/p/6155883.html
《新程序員》:云原生和全面數(shù)字化實踐 50位技術專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔 為你收集整理的ASP.NET MVC 5 使用autofac实现DI 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內容還不錯,歡迎將生活随笔 推薦給好友。