Asp.Net WebApi使用Autofac實現依賴注入

什麼是依賴注入?

在編程中,依賴注入是一種實現控制反轉且用於解決依賴性問題的設計模式。一個依賴關係指的是可被利用的一種對象 。依賴注入是將所依賴的傳遞給將要使用的從屬對象。該服務將會變成客戶端狀態的一部分並傳遞服務給客戶端,而不允許客戶端來建立或尋找服務。依賴注入使我們的編程代碼變得鬆散耦合,易於管理。

依賴注入的類型:

構造函數注入:在構造函數注入中,注入器通過客戶端類構造函數提供服務(依賴性)。

屬性注入:在屬性注入(又名Setter注入)中,注入器通過客戶端類的公共屬性提供依賴性。

方法注入:在這種類型的注入中,客戶端類實現一個接口,該接口聲明方法以提供依賴性,並且注入器使用此接口來提供對客戶端類的依賴性。

依賴注入的好處:

    1.減少依賴性

      依賴注入可以消除或者減少組件間不必要的依賴性。以降低組件改變時所帶來的影響組件

    2.增強可重用性

      減少組件依賴性可以增強組件的可重用性。如果在不同的上下文中需要某個接口的不同實現,或者只是同一實現的不同配置,則可以將該組件配置爲使用該實現。無需更改代碼。

    3.增加代碼的可測試性

        依賴注入也增加了組件的可測試性。當依賴項可以注入組件時,意味着可以注入這些依賴項的模擬實現。模擬對象用於測試作爲實際實現的替代,並且可以配置模擬對象的行爲

    4.增強代碼的可讀性

依賴注入可將依賴項移動到組件的接口。使得更容易看到組件中哪些具有依賴關係,從而使代碼更具可讀性。

    5.減少依賴性承載

依賴性承載會在代碼中產生大量“噪音”,使其難以閱讀和維護,並且使得組件更難測試。而依賴注入可以減少依賴性承載和靜態單例的使用,可以將組件完美的連接在一起

使用Autoface:

Autofac是一款IOC框架,比較於其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很輕量級性能上非常高。

 

一、環境

.NET Framework 4.7.2  WebApi項目

在NuGet引用 Autofac

創建AutofacBuilder類

using Autofac;
using User.Interface;
using User.Repository;

namespace User.Common.Autofac
{
    public class AutofacBuilder
    {
        public static void SetupResolveRules(ContainerBuilder builder)
        {
            builder.RegisterType<LoginRepository>().As<ILoginRepository>();
        }
    }
}

在Global.asax文件中添加

using Autofac;
using Autofac.Integration.Mvc;
using Autofac.Integration.WebApi;
using User.Common.Autofac;
using System.Reflection;
using System.Web.Http;
using System.Web.Mvc;

namespace User
{
    public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            GlobalConfiguration.Configure(WebApiConfig.Register);
            AreaRegistration.RegisterAllAreas();
           
            //Autofac
            var builder = new ContainerBuilder();

            AutofacBuilder.SetupResolveRules(builder);
            builder.RegisterControllers(Assembly.GetExecutingAssembly());

            builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
            builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).AsImplementedInterfaces().AsSelf();

            var container = builder.Build();

            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
            configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);
        }
    }
}

在Api類中調用

 public class LoginsController : ApiController
    {
        private readonly ILoginRepository _loginRepository;
        public LoginsController(ILoginRepository loginRepository)
        {
            _loginRepository = loginRepository;
        }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章