.Net Core 依赖注入
参考链接
- https://www.cnblogs.com/diwu0510/p/11562248.html 小demo的参考这个
- https://www.cnblogs.com/RayWang/p/11165509.html 介绍的比较详细,多看看
- https://www.cnblogs.com/cool2feel/p/11508023.html 依赖注入概述
- https://www.cnblogs.com/laozhang-is-phi/p/9541414.html 为什么要使用依赖注入,里面的斧头的例子挺好的
依赖注入概述
在软件设计的通用原则中,SOLID是非常流行的缩略语,它由5个设计原则的首字母构成:单一原则(S)、开放封闭原则(O)、里氏替换原则(L)、接口分离原则(I)、依赖反转原则(D)。本篇介绍依赖反转原则以及在
ASP.NET Core
中的实现。
直接依赖是指:当一个类需要另一个类协作来完成工作的时候就产生了依赖。举例比如:模块 A 调用模块 B 中的函数,而模块 B 又调用模块 C 中的函数,则编译时 A 取决于 B,而 B 又取决于 C。这是有严重的依赖关系,不属于松散耦合。
依赖反转是指:高层模块不应该依赖低层模块,二者都应该依赖于抽象,是对接口而不是实现编程。当一个类(Class)需要被外部依赖,就需要把它抽象成一个接口(interface),如何把这个接口变成具体可调用的实例,就是由依赖注入来完成。依赖反转是生成松散耦合应用程序的关键一环。当应用依赖反转原则后,A 可以调用 B 实现的抽象上的方法,让 A 可以在运行时调用 B,而 B 又在编译时依赖于 A 控制的接口。 运行时程序执行的流程保持不变,但接口引入意味着可以轻松插入这些接口的不同实现。
为什么要使用依赖注入
(1)原始社会里,没有社会分工。须要斧子的人(调用者)仅仅能自己去磨一把斧子(被调用者)。相应的情形为:软件程序里的调用者自己创建被调用者。
(2)进入工业社会,工厂出现。斧子不再由普通人完毕,而在工厂里被生产出来,此时须要斧子的人(调用者)找到工厂,购买斧子,无须关心斧子的制造过程。相应软件程序的简单工厂的设计模式。
(3)进入“按需分配”社会,需要斧子的人不需要找到工厂,坐在家里发出一个简单指令:须要斧子。斧子就自然出如今他面前。相应Spring的依赖注入。
小demo
1.接口和对应的实现类
public interface ITestSayHello
{
string Hello();
}
public class Test : ITestSayHello
{
public string Hello()
{
return "Hello";
}
}
2.Nuget引入Autofac
3.修改Program.cs,添加有注释的那一行代码
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())//需要在 Program.cs 中的 CreateHostBuilder 中,添加Autofac的服务工厂:
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
4.Startup中修改
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers().AddControllersAsServices(); //增加 .AddControllersAsServices()
services.AddTransient<ITestSayHello, Test>(); //具体生命周期的再研究吧。
}
public void ConfigureContainer(ContainerBuilder builder)
{
builder.RegisterType<Test>();//注册服务,接口不行
}
5.控制器构造函数
readonly ITestSayHello _test;
public WeatherForecastController(ITestSayHello test)
{
_test = test;
}
[HttpGet]
public async Task<dynamic> Get()
{
return _test.Hello(); //成功返回
}