什么是依赖注入?
在编程中,依赖注入是一种实现控制反转且用于解决依赖性问题的设计模式。一个依赖关系指的是可被利用的一种对象 。依赖注入是将所依赖的传递给将要使用的从属对象。该服务将会变成客户端状态的一部分并传递服务给客户端,而不允许客户端来建立或寻找服务。依赖注入使我们的编程代码变得松散耦合,易于管理。
依赖注入的类型:
构造函数注入:在构造函数注入中,注入器通过客户端类构造函数提供服务(依赖性)。
属性注入:在属性注入(又名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;
}
}