IOC(控制反轉和依賴注入)之Autofac
阿新 • • 發佈:2019-01-30
Autofac是一款IOC框架,比較於其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很輕量級效能上也是很高的。於是,今天抽空研究了下它。下載地址:http://code.google.com/p/autofac/downloads/list
1、解壓它的壓縮包,主要看到Autofac.dll,Autofac.Configuration.dll,這也是本篇文章重點使用的Autofac的類庫。
2、引用->新增引用
3、定義介面,類
public interface ILog { void SaveLog(string message); } public class TxtLog : ILog { public void SaveLog(string message) { throw new NotImplementedException(); } } public class DbLog : ILog { public void SaveLog(string message) { throw new NotImplementedException(); } }
4、在 Global.asax 的 Application_Start() 上註冊服務
using Autofac;
using Autofac.Integration.Mvc;
using System.Reflection;
protected void Application_Start() { //......... //第一步:建立ContainerBuilder物件。 ContainerBuilder builder = new ContainerBuilder(); //第二步:註冊服務(註冊Controller類,註冊程式集,註冊型別) builder.RegisterControllers(Assembly.GetExecutingAssembly());//註冊了當前程式集內所有的Controller類 builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())//註冊了當前程式集內的所有類 .AsImplementedInterfaces(); builder.RegisterType<DbLog>().As<ILog>(); //可看出ILog的型別已變成了DbLog。但為何要強調末端處?實際上,DBLog已經通過builder.RegisterAssemblyTypes被註冊過一次,如果對同一個型別或介面註冊多次(比如這裡的ILog),在Autofac中會以列表的形式儲存,如果只取一個,則Autofac會從列表返回最新的那個。 //第三步:建立容器 var container = builder.Build(); //第四步:用AutofacDependencyResolver替換MVC預設的DependencyResolver DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); }
5、Controller 方法
public class HomeController : Controller { private ILog _log; private IEnumerable<ILog> _logList; public HomeController(ILog log,IEnumerable<ILog> logList) { _log = log; _logList = logList; } public ActionResult Index() { ViewBag.Message = "Welcome to ASP.NET MVC!"; ViewBag.LogTypeName = _log.GetType().Name; ViewBag.LogTypeNames = _logList.Select(x => x.GetType().Name).Aggregate((x, y) => x + "," + y); return View(); } }
6、View
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<title>Index</title>
</head>
<body>
<div>
Autofac會從列表返回最新的那個: @ViewBag.LogTypeName
</div>
<div>
同一個型別或介面註冊多次(比如這裡的ILog),在Autofac中會以列表的形式儲存(第一個,是最後也個註冊的物件):@ViewBag.LogTypeNames
</div>
</body>
</html>
7、效果: