什麼是依賴注入?
在編程中,依賴注入是一種實現控制反轉且用於解決依賴性問題的設計模式。一個依賴關係指的是可被利用的一種對象 。依賴注入是將所依賴的傳遞給將要使用的從屬對象。該服務將會變成客戶端狀態的一部分並傳遞服務給客戶端,而不允許客戶端來建立或尋找服務。依賴注入使我們的編程代碼變得鬆散耦合,易於管理。
依賴注入的類型:
構造函數注入:在構造函數注入中,注入器通過客戶端類構造函數提供服務(依賴性)。
屬性注入:在屬性注入(又名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;
}
}