开放源码编程教程
开放源代码(Open source code)也称为源代码公开,指的是⼀种软件发布模式。⼀般的软件仅可取得已经过编译的⼆进制可执⾏档,通常只有软件的作者或著作权所有者等拥有程序的原始码。
⽂件:(访问密码:551685)
以下内容⽆关:
-------------------------------------------分割线---------------------------------------------
中的依赖注⼊实际上帮助我们解耦了我们的代码,是控制反转和依赖反转原则的具体实现。
.Net Core的依赖注⼊的好处:公开课培训网
1. application 更稳定,容易维护和演化;
西安德语培训2. 实现细节的变化,不需要到处更改,在声明的时候进⾏替换即可;
3. 测试更容易,更好地mock依赖的rvice等。
4. ⾼级的模块或者服务不应该依赖于具体的实现,⽽是抽象。
服务的⽣命周期
1. Singleton: 应⽤程序运⾏期间是唯⼀的。需要考虑线程安全性,效率⾼
2. Scoped: 每个请求期间,实例唯⼀;需要考虑线程安全性,效率
3. Transient: 每次需要的时候实例化,不需要考虑线程安全,效率相对较低家人英文
关于服务的声明周期: ⼀个服务不应该依赖于⽐它⽣命周期短的服务。
我们通过 AddTransient,AddSingleton, AddScoped 可以完成⼤多数的场景需要;
rviceDescriptor 对象⼀般是隐含在直接调⽤的AddSingleton/AddTransient/AddScoped中的。
复制代码
var rviceDescriptor = new ServiceDescriptor.Singleton<IServiceA, ServiceA>();
rvices.Add(rviceDescriptor);
=== 等价于
国王的演讲英文台词
rvices.AddSingleto<IServiceA, ServiceA>();
复制代码
ServiceCollection 复杂场景的使⽤
1. 同⼀个接⼝的不同实现,TryAdd
DI container 会按照注⼊顺序去resolve需要的接⼝实现,如下:
复制代码
rvices.AddSingleton<IWeatherForecaster, WeatherForecaster>();
rvices.AddSingleton<IWeatherForecaster, AmazingWeatherForecaster>();
metallurgicalpublic ServiceA(private IWeatherForecaster _weather) {
}
复制代码
_weather 实例化出来的 class 是typeof(AmazingWeatherForecaste), 按照我们在 ConfigureServices 中声明的顺序,最后⼀个起作⽤;
对ServiceCollection 的理解:rviceCollection是⼀个集合,⾥⾯包含了webhost加⼊的⼀些内置 ServiceDescriptors, 以及我们在configurervices 中声明的注⼊。
因此,本质上,我们对于这个rvicecollection⾥⾯的操作可以参照集合的操作。
2. 取代接⼝的实现和移除接⼝的所有实现
Replace: 取代rvicetype 的第⼀个实现,⽰例如下。
rvices.AddSingleton<IWeatherForecaster, WeatherForecaster>();
rvices.Replace(ServiceDescriptor.Singleton<IWeatherForecaster, AmazingWeatherForecaster>());
通过如上代码,我们在 rvice collection中只能找到 IWeatherForecaster 实现 只有 AmazingWeatherForecaster, 因为AmazingWeatherForecaster 取代了 WeatherForecaster。
RemoveAll: 在rvice collection 中移除rviceType 的所有实现。
雅思要求词汇量3. 注册接⼝的多个实现
我们知道,在rvice collection中,是可以存在⼀个接⼝多个实现的注册信息的,那么我们有什么好的⽅法去注册⼀个接⼝的多个实现么? TryAddEnumerable
复制代码
rvices.TryAddEnumerable(new[]
{
ServiceDescriptor.Singleton<ICourtBookingRule, ClubIsOpenRule>(),委内瑞拉官方语言
ServiceDescriptor.Singleton<ICourtBookingRule, MaxBookingLengthRule>(),
ServiceDescriptor.Singleton<ICourtBookingRule, MaxPeakTimeBookingLengthRule>(),
贱熊30});
=== 等价于
the catcher in the ryervices.TryAddEnumerable(ServiceDescriptor.Singleton<ICourtBookingRule, ClubIsOpenRule>());
rvices.TryAddEnumerable(ServiceDescriptor.Singleton<ICourtBookingRule, MaxBookingLengthRule>());
复制代码
4. ⼯⼚模式
⼯⼚模式允许我们在创建rvice 时候更加随⼼所欲, 拥有⾃⼰的掌控度。
复制代码
xerox
rvices.TryAddSingleton();
rvices.TryAddSingleton();
rvices.AddSingleton(sp =>
new CompositeNotificationService(
new INotificationService[]
{
sp.GetRequiredService(),
sp.GetRequiredService()
}));
复制代码
例⼦中的使⽤场景是: 我们通过 CompositeNotificationService 去组合各种的 INotificationService, 因此使⽅不需要关⼼如何发notification 或者需要发送多少类型的notification。