1. 程式人生 > >AutoFac實現程式集級別的依賴注入

AutoFac實現程式集級別的依賴注入

1.在“工具”->“NuGet包管理器”->"程式包管理器控制檯"執行一下程式碼,安裝autofac。 

  Install-Package Autofac

 當使用 autoFac 開發ASP .net 遇到 ContainerBuilder() 不包含RegisterControllers 方法解決方案(MVC環境下,注入Controller需要安裝包)

Install-Package Autofac.Mvc5 -Version 4.0.2

當然也可以在專案點選右鍵點選“管理NuGet程式包 ”,在NuGet管理包頁面,搜尋AutoFac,進行下載安裝。

2.using AutoFac;

  using  AutoFac.Intergation.MVC;

3.依賴注入配置程式碼(Golbal.asax的Application_Start方法中新增一下程式碼)

/// <summary>
      /// 使用AutoFac實現依賴注入
      /// </summary>
      private void autoFac()
      {
          var builder = new ContainerBuilder();
          SetupResolveRules(builder);  //注入
 
          builder.RegisterControllers(Assembly.GetExecutingAssembly());  //注入所有Controller
          var container = builder.Build();
          DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
      }

private void SetupResolveRules(ContainerBuilder builder)
       {
           //UI專案只用引用service和repository的介面,不用引用實現的dll。
           //如需載入實現的程式集,將dll拷貝到bin目錄下即可,不用引用dll
           var IServices = Assembly.Load("MyMVC3.Business.IServices");   
           var Services = Assembly.Load("MyMVC3.Business.Services");
           var IRepository = Assembly.Load("MyMVC3.Modules.IRepository");
           var Repository = Assembly.Load("MyMVC3.Modules.Repository");
 
           //根據名稱約定(服務層的介面和實現均以Service結尾),實現服務介面和服務實現的依賴
           builder.RegisterAssemblyTypes(IServices, Services)
             .Where(t => t.Name.EndsWith("Service"))
             .AsImplementedInterfaces();
 
           //根據名稱約定(資料訪問層的介面和實現均以Repository結尾),實現資料訪問介面和資料訪問實現的依賴
           builder.RegisterAssemblyTypes(IRepository, Repository)
             .Where(t => t.Name.EndsWith("Repository"))
             .AsImplementedInterfaces();
       }

4.各層之間注入程式碼

private IUserInfoRepository productRepository;
        public UserInfoService(IUserInfoRepository productRepository)
        {
            this.productRepository = productRepository;
            this.AddDisposableObject(productRepository);
        }
public IUserInfoService userService;
 
      public HomeController(IUserInfoService userService)
      {
          this.userService = userService;
          this.AddDisposableObject(userService);
      }