Autofac總結

Autofac

介紹|術語

控制反轉:IOC和DI

  1. IOC
    • 調用者再也不建立(不本身new)被調用者的實例,而是交給容器去建立(AutoFac就充當這裏的容器),這就是控制反轉
    • 控制反轉中引入的第三方對象,經過Ioc容器將對象與對象的關係進行解耦,對象的建立與維護讓渡給第三方容器
    • Ioc容器負責維護對象與對象之間的關係,並負責對象的建立和對象生命週期的維護
  2. DI
    • 容器建立好的實例再注入調用者的過程,就是依賴注入(好比:屬性注入、構造函數注入等)
    • 依賴注入就是將實例變量傳入到一個對象中去
  3. 控制反轉和依賴注入的關係
    • 控制反轉是一種思想
    • 依賴注入是一種設計模式
  4. 依賴倒置
    依賴倒置(Dependence Inversion Principle,縮寫爲DIP),是一種設計原則,是指:
    • 高層模塊不該該依賴底層模塊,都應該依賴於抽象
    • 抽象不該該依賴於具體,具體依賴於抽象

緣由:html

+ 若高層依賴於底層,那麼底層的變更也會致使高層的變更,這就會致使模塊的複用性下降並且大大提升了開發的成本。
+ 如果依賴於抽象的話,那麼是比較穩定的,底層或者高層的變更都不會互相影響

控制反轉背後的核心思想是, 咱們再也不將類綁定在應用裏,讓類本身去 "new up" 他們的依賴, 而是反過來在類的構造方法中將依賴傳遞進去git

原理

尋找到相關實例,將其賦給接口對象。github

組件|服務

public class SomeType : IService
{
}

在代碼中能夠經過兩種方法訪問該類型(SomeType):c#

  • 經過類型自己, SomeType
  • 經過接口, IService

組件 指的是 SomeType 而它暴露的 服務 指的是 SomeTypeIService.設計模式

Autofac入門

MVC|Autofac手動注入

  1. 新建項目,ASP.NET MVC 5 Web應用程序
  2. 安裝Autofac和Autofac Integration mvc5
  3. 創建業務實體項目,解決方案右鍵,添加,新建項目,類庫,Models
  4. 創建業務邏輯項目,解決方案右鍵,添加,新建項目,類庫,Services
  5. 項目Services裏面創建接口IGradeService
  6. 項目Services裏面創建類GradeService,繼承接口IGradeService,實現方法
  7. 修改HomeController裏面Index方法
public HomeController(IGradeService gradeService)
    {
        _gradeService = gradeService;
    }

    public ActionResult Index()
    {
        var model = _gradeService.GetAllGrade().ToList();

        return View(model);
    }
  1. 修改Global.asax,在Application_Start()方法裏面添加以下代碼
public void Application_Start()
{
    ...
    //依賴注入
    var builder = new ContainerBuilder();
    builder.RegisterType().As().InstancePerHttpRequest();
    
    builder.RegisterControllers(Assembly.GetExecutingAssembly());
    builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
    .AsImplementedInterfaces();
    var container = builder.Build();
    DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}

MVC|Autofac自動注入

  1. 新建項目,ASP.NET MVC 5 Web應用程序
  2. 安裝Autofac和Autofac Integration mvc5
  3. 創建業務實體項目,解決方案右鍵,添加,新建項目,類庫,Models
  4. 創建業務邏輯項目,解決方案右鍵,添加,新建項目,類庫,Services
  5. 項目Services裏面創建接口IDependency接口
namespace MvcApp5.Models
{
    public interface IDependency
    {
    }
}
  1. 項目Services裏面創建接口IGradeService抽象接口,其餘任何的接口都須要繼承這個接口
  2. 項目Services裏面創建類GradeService,繼承接口IGradeService,IDependency,實現IGradeService抽象接口方法
  3. 修改HomeController裏面Index方法
public class HomeController : Controller
{
        private readonly IModelCar _carmodel;
        private readonly IModelUser _usermodel;

        public HomeController(IModelCar carmodel,IModelUser usermodel)
        {
            _carmodel = carmodel;
            _usermodel = usermodel;
        }

        public ActionResult Index()
        {
            ViewBag.Message = "修改此模板以快速啓動你的 ASP.NET MVC 應用程序。";
            var carname=_carmodel.GetCarName();
            var username = _usermodel.GetUserName();
            return View();
        }
}
  1. 修改Global.asax,在Application_Start()方法裏面添加以下代碼
public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

           var builder=RegisterService();
            
           DependencyResolver.SetResolver(new AutofacDependencyResolver(builder.Build()));
            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            AuthConfig.RegisterAuth();
        }

        private ContainerBuilder RegisterService()
        {
            var builder = new ContainerBuilder();

           var baseType=typeof(IDependency);
           var assemblys=AppDomain.CurrentDomain.GetAssemblies().ToList();            
           var AllServices = assemblys
               .SelectMany(s => s.GetTypes())
               .Where(p => baseType.IsAssignableFrom(p)&&p!=baseType);

           builder.RegisterControllers(assemblys.ToArray());
        
           builder.RegisterAssemblyTypes(assemblys.ToArray())
                  .Where(t =>baseType.IsAssignableFrom(t)&&t!=baseType)
                  .AsImplementedInterfaces().InstancePerLifetimeScope();
           return builder;
        }
    }

API|Autofac自動注入

  1. 新建項目,ASP.NET Web應用程序,勾選MVC,API
  2. 安裝Autofac和Autofac Integration mvc5,Autofac.Integration.WebApi 2.X
  3. 創建業務實體項目,解決方案右鍵,添加,新建項目,類庫,Models
  4. 創建業務邏輯項目,解決方案右鍵,添加,新建項目,類庫,Services
  5. 項目Services裏面創建接口IDependency接口
  6. 項目Services裏面創建接口IGradeService抽象接口,其餘任何的接口都須要繼承這個接口
  7. 項目Services裏面創建類GradeService,繼承接口IGradeService,IDependency,實現IGradeService抽象接口方法
  8. 修改控制器代碼
public class ValuesController : ApiController
    {
        private readonly IUserService _UserService;
        public ValuesController(IUserService UserService)
        {
            _UserService = UserService;
        }
        public IHttpActionResult Get(string name)
        {
             string str = _UserService.Set(name);

            return Ok(str);
        }
    }
  1. 修改Global.asax,在Application_Start()方法裏面添加以下代碼
public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            #region 自動注入
            //建立autofac管理註冊類的容器實例
            var builder = new ContainerBuilder();
            HttpConfiguration config = GlobalConfiguration.Configuration;
            Assembly[] assemblies = Directory.GetFiles(AppDomain.CurrentDomain.RelativeSearchPath, "*.dll").Select(Assembly.LoadFrom).ToArray();
            //註冊全部實現了 IDependency 接口的類型
            Type baseType = typeof(IDependency);
            builder.RegisterAssemblyTypes(assemblies)
               .Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract)
               .AsSelf().AsImplementedInterfaces()
               .PropertiesAutowired().InstancePerLifetimeScope();
            //註冊MVC類型
            // builder.RegisterControllers(assemblies).PropertiesAutowired();
            //註冊Api類型
            builder.RegisterApiControllers(assemblies).PropertiesAutowired();
            //builder.RegisterFilterProvider();
            builder.RegisterWebApiFilterProvider(config);
            var container = builder.Build();
            //註冊api容器須要使用HttpConfiguration對象
            config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
            //註冊解析
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
            #endregion
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
    }

參考文檔

我的博客
博客園
CSDN
官方文檔api

相關文章
相關標籤/搜索