原文:
1.新建一個IService接口類
1 //定位Service程序集
2 public interface IService
3 {
4 }
創建需要注入的服務類
2.在新建一個用戶服務類
1 using Entity;
2 public interface IUserService
3 {
4 string AddUserInfo(Sys_User user);
5
6 string GetUserPhone(string UserId);
7 }
8
9 public class UserService : IUserService
10 {
11 public string AddUserInfo(Sys_User user)
12 {
13 string newId = "1000000";
14 return string.Format("{0},注冊成功 ID為:{1}", user.Name, newId);
15 }
16
17 public string GetUserPhone(string UserId)
18 {
19 return "18900000000";
20 }
21 }
3.在新建一個信息處理服務類
1 public interface IMessageService
2 {
3 void SendMessage(string Msg);
4
5 string GetMessage(string UserID);
6 }
7
8 public class MessageService : IMessageService
9 {
10 public string GetMessage(string UserID)
11 {
12 return "Hello World!";
13 }
14
15 public void SendMessage(string Msg)
16 {
17 //發送成功
18 }
19 }
4.在創建一個ServiceLocator類,用來獲取注入的服務
1 using Autofac;//引包
2 /// <summary>
3 /// Autofac的服務定位器
4 /// </summary>
5 public class ServiceLocator
6 {
7 private static IContainer _container;
8
9 /// <summary>
10 /// 設置Ico容器
11 /// </summary>
12 /// <param name="container"></param>
13 public static void SetContainer(IContainer container)
14 {
15 _container = container;
16 }
17
18 /// <summary>
19 /// 獲取服務
20 /// </summary>
21 /// <typeparam name="IService"></typeparam>
22 /// <returns></returns>
23 public static IService GetService<IService>()
24 {
25 return _container.Resolve<IService>();
26 }
27
28 /// <summary>
29 /// 獲取容器對象
30 /// </summary>
31 /// <returns></returns>
32 public static IContainer GetContainer()
33 {
34 return _container;
35 }
36 }
5.在項目Global.asax中注冊服務類
1 using Autofac;
2 using Autofac.Integration.Mvc;
3 using Service;
4
5 public class MvcApplication : System.Web.HttpApplication
6 {
7 protected void Application_Start()
8 {
9 AreaRegistration.RegisterAllAreas();
10 RouteConfig.RegisterRoutes(RouteTable.Routes);
11
12 //獲取Autofac容器構造器
13 var builder = new ContainerBuilder();
14 //注冊IService接口的程序集中包含Service的接口
15 builder.RegisterAssemblyTypes(typeof(Service.IService.IService).Assembly)
16 .Where(t => t.Name.EndsWith("Service"))
17 .AsImplementedInterfaces();
18 //注冊項目的Controllers
19 builder.RegisterControllers(System.Reflection.Assembly.GetExecutingAssembly()).PropertiesAutowired();
20
21 //獲取注入容器
22 var container = builder.Build();
23 //設置服務容器
24 ServiceLocator.SetContainer(container);
25 //設置MVC的注入解析程序
26 DependencyResolver.SetResolver(new AutofacDependencyResolver(ServiceLocator.GetContainer()));
27 }
28 }
6.注入服務及調用
1 using Entity;
2 using Service;
3 using Service.IService;
4 public class HomeController : Controller
5 {
6 //兩種方式獲取注入的服務
7
8 private readonly IUserService userService;
9 //通過服務容器獲取
10 private readonly IMessageService messageService = ServiceLocator.GetService<IMessageService>();
11
12 //通過構造函數注入
13 public HomeController(IUserService _userService)
14 {
15 this.userService = _userService;
16 }
17
18 public ActionResult Index()
19 {
20 this.ViewBag.UserPhone = this.userService.GetUserPhone("張三");
21 this.ViewBag.Message = this.messageService.GetMessage("");
22 return View();
23 }
24 }
7.測試結果


四.注冊注意事項。
在Global.asax中注冊服務類的時候 我們為了防止注冊一些沒有必要的實體類進去。添加了一句條件

加上這個注冊條件后 就表示你的所有需要注入的服務類 的類名都必須以Service結尾。否則就會導致在使用時報沒有注冊的錯誤。
例如 下圖:把UserService 類名改為 UserTest


解決此問題,也可以這樣

注釋那句注冊時的篩選條件,但是值得注意的是,這樣就會造成資源浪費,把在同一個程序集下面的非服務類也給注冊進去了。

