首先我们要下载程序包
然后添加引用:
using Microsoft.Extensions.DependencyInjection;
我们用到了:
ServiceCollection()方法,
AddScoped()方法,每次请求,都获取一个新的实例。同一个请求获取多次会得到相同的实例
我们通过AddScoped获得实例(对象)
BuildServiceProvider()方法,
GetService<>()方法,
然后我们使用到的类依然是之前用过的坦克类
class Program
{
static void Main(string[] args)
{
/*一次性注册*/
var sc = new ServiceCollection();//接口的实现者就是服务的提供者,new 一个容器
sc.AddScoped(typeof(ITank), typeof(Type99));//我们可以在Scoped里要对象,
//[ITank是静态类型,type(ITank)是拿到动态描述]
//AddScoped(接口类型(动态类型描述),哪个类实现接口(动态类型描述)),然后把一对类型放入容器
var sp = sc.BuildServiceProvider();
/*===============分割线================*/
//分割线以下,代表在程序的各个地方只要能看到ServiceProvider,你都可以这么用而不再有new操作符,我们从Contener里要对象,比如:
ITank tank = sp.GetService<ITank>();
tank.Fire();
tank.Run();
}
}
interface IVehicle
{
void Run();
}
interface IWeapon
{
void Fire();
}
interface ITank:IVehicle,IWeapon
{
}
class Type99 : ITank
{
public void Fire()
{
Console.WriteLine("Boom!");
}
public void Run()
{
Console.WriteLine("Ka!");
}
}
好处:
整个开发程序过程中,千千万万个地方用到ITank这个接口引用的实例,突然有一天程序升级,要求把type99(99式坦克)升级为type19D(19式对陆强化改二丁坦克),如果在程序中用的
ITank tank = new type99();
的话,程序中所有的new操作符后面的type99()都要改成type19D。但是我们不能保证所有new type99()都改为type19D,因为有些逻辑可能还是在使用new type99()
通过依赖注入,我们就可以只在
sc.AddScoped(typeof(ITank), typeof(Type99));
改为
sc.AddScoped(typeof(ITank), typeof(Type19D));
这样所有使用的千千万万个对象都是从Contener中拿到的,没有使用new,所以就很方便完成了程序的改动。