一、什么是依赖注入(DI)?
依赖注入是一种面向对象设计技巧。通过将对象的依赖关系移动到需要依赖它们的对象的构造函数中,DI让对象更加解耦,使得软件更容易维护、测试和重用。
二、什么是控制反转(IoC)?
控制反转是依赖注入背后的原则。它可以被解释为创建对象的过程被反转了。传统上,在应用程序中,对象是通过直接调用其构造函数或工厂方法来创建的。而在IoC容器中,创建过程由容器控制,它在需要时主动向应用程序提供所需的对象。
三、IoC容器的两种类型
IoC容器可以分为两种类型:
1、外部容器:外部容器是一些可用的IoC容器,如Autofac、Unity、StructureMap等。外部容器提供了一个依赖管理体系,可以用来管理企业系统中的所有依赖。在使用外部容器时,需要将容器框架添加到项目中,并编写配置文件以注册依赖。
2、内部容器:内部容器是应用程序自身实现的依赖注入容器。ASP.NET Core中的IServiceProvider是一个内部容器,它可以通过添加依赖关系服务来注册依赖项,并通过构造函数注入。
四、使用依赖注入和控制反转的好处
1、减少了代码的耦合,使得应用程序的可测试性更好。
2、依赖注入也可以实现AOP,让代码更具可扩展性。
3、使用IoC容器可以管理对象的实例化和生命周期,提高了代码的复用性。
4、使用IoC容器可以更容易地实现非线性依赖关系。
5、能够将一些配置、数据等信息集中管理,提高应用整体性能。
五、.NET Core中的依赖注入
ASP.NET Core中使用Microsoft.Extensions.DependencyInjection命名空间来实现依赖注入。ServiceProvider是默认的Ioc容器。
using Microsoft.Extensions.DependencyInjection; public class Program { public static void Main(string[] args) { var serviceProvider = new ServiceCollection() .AddScoped() .AddTransient () .BuildServiceProvider(); var foo = serviceProvider.GetService (); foo.DoSomething(); } } public interface IFoo { void DoSomething(); } public class Foo : IFoo { private readonly IBar _bar; public Foo(IBar bar) { _bar = bar; } public void DoSomething() { Console.WriteLine("Foo is doing something"); _bar.DoSomethingElse(); } } public interface IBar { void DoSomethingElse(); } public class Bar : IBar { public void DoSomethingElse() { Console.WriteLine("Bar is doing something else"); } }
六、ASP.NET Core中的依赖注入
ASP.NET Core内置的依赖注入功能用来处理不同类之间的依赖项关系,并对所有服务的生命周期进行管理。
以下是ASP.NET Core项目中使用DI的示例:
services.AddScoped<IFooService, FooService>();
上面的代码片段将服务(IFooService)和它的实例(FooService)注册到容器中,这个服务在需要的地方都可以被使用。
七、.NET Core中的生命周期
.NET Core中有三种生命周期:
1、Singleton:单例模式,创建一个对象实例并将其重用。
2、Scoped:创建一个对象实例并将其重用,但在每个HTTP请求处理期间都是唯一的。
3、Transient:在每次请求时都生成一个新的对象实例。
以下代码示例说明了一些不同的生命周期:
services.AddSingleton<IFooService, FooService>(); services.AddScoped<IBarService, BarService>(); services.AddTransient<IBazService, BazService>();
八、小结
依赖注入和控制反转是设计良好的面向对象程序设计的重要工具。.NET Core中的依赖注入提供了一种易于使用、强大而灵活的依赖注入框架。无论是使用内部容器还是外部容器,使用依赖注入将提高您的代码的可测性和扩展性。