static void Main(string[] args) { var sc = new ServiceCollection(); sc.AddScoped(typeof(ITank), typeof(HeavyTank)); //**依赖注入**,只要将这里 HeavyTank 改成MediumTank sc.AddScoped(typeof(IVehicle), typeof(MediumTank)); sc.AddScoped <Driver>(); var sp = sc.BuildServiceProvider(); //==========华丽的分割线===========// var driver = sp.GetService <Driver>(); driver.Drive(); ITank tank = sp.GetService <ITank>(); tank.Fire(); tank.Run(); /* * ITank tank = new HeavyTank(); * var t = tank.GetType(); * object o = Activator.CreateInstance(t); * MethodInfo fireMi = t.GetMethod("Fire"); //反射 * MethodInfo runMi = t.GetMethod("Run"); * fireMi.Invoke(o, null); * runMi.Invoke(o, null); */ /* * //var driver = new Driver(new HeavyTank()); //接口 * //driver.Drive(); */ Console.WriteLine("Hello World!"); }
public static void Main(string[] args) { //对于反射的学习 ITank tank = new HeavyTank(); //======华丽的分割线======= Type t = tank.GetType(); //获得tank类对应的type Object o = Activator.CreateInstance(t); //从Type出发利用激活器来创建实例 //从Type出发,获取某个类的方法的信息 MethodInfo fireMi = t.GetMethod("Fire"); MethodInfo RunMi = t.GetMethod("Run"); //将方法和实例绑定,调用方法 fireMi.Invoke(o, null); RunMi.Invoke(o, null); Console.WriteLine(); //依赖注入相关学习 var sc = new ServiceCollection();//容器,ServiceCollection(用来装载“服务”,即各种接口,类型) sc.AddScoped(typeof(ITank), typeof(HeavyTank)); var sp = sc.BuildServiceProvider();//ServiceProvider(用来提供“服务”) //===========华丽的分割线========== ITank tank1 = sp.GetService <ITank>(); tank1.Fire(); tank1.Run(); Console.ReadLine(); }
static void Main(string[] args) { //Console.WriteLine("Hello World!"); var driver = new Driver(new HeavyTank()); driver.Drive(); int[] nums1 = { 1, 2, 3, 4, 5 }; ArrayList nums2 = new ArrayList { 1, 2, 3, 4, 5 }; Console.WriteLine(Sum(nums1)); Console.WriteLine(Sum(nums2)); var roc = new ReadOnlyCollection(nums1); Console.WriteLine(Sum(roc)); //foreach(var n in roc) //{ // Console.WriteLine(n); //} IKiller killer = new WarmKiller(); killer.Kill(); //var wk =killer as WarmKiller; var wk = (IGentleman)killer; wk.Love(); ITank tank = new HeavyTank(); var t = tank.GetType(); object o = Activator.CreateInstance(t); MethodInfo fireMi = t.GetMethod("Fire"); MethodInfo runMi = t.GetMethod("Run"); fireMi.Invoke(o, null); runMi.Invoke(o, null); //reflection var sc = new ServiceCollection(); sc.AddScoped(typeof(ITank), typeof(HeavyTank)); sc.AddScoped(typeof(IVehicle), typeof(LightTank)); sc.AddScoped <Driver>(); var sp = sc.BuildServiceProvider(); var driver1 = sp.GetService <Driver>(); driver1.Drive(); ITank tank1 = sp.GetService <ITank>(); tank1.Fire(); tank1.Run(); }
static void Main(string[] args) { var sc = new ServiceCollection(); sc.AddScoped(typeof(ITank), typeof(MiddleTank)); sc.AddScoped(typeof(IVehicle), typeof(LightTank)); sc.AddScoped <Driver>(); var sp = sc.BuildServiceProvider(); //===================================== ITank tank = sp.GetService <ITank>(); tank.Fire(); tank.Run(); var driver = sp.GetService <Driver>(); driver.Run(); }
static void Main(string[] args) { var serviceCollection = new ServiceCollection(); //ITank是静态类型,typeof后才能拿到动态的类型描述 //AddScoped方法有多种重载,这里调用的是第一个参数为一个类型,第二个参数为谁实现了这个类型 serviceCollection.AddScoped(typeof(ITank), typeof(HeavyTank)); serviceCollection.AddScoped(typeof(IVehicle), typeof(Car)); serviceCollection.AddScoped <Driver>(); var serviceProvider = serviceCollection.BuildServiceProvider(); //-------------------以上为注册------------------------------- ITank tank = serviceProvider.GetService <ITank>(); tank.Fire(); tank.run(); //-------------------------------------------------------------- Driver driver = serviceProvider.GetService <Driver>(); driver.Drive(); }
static void Main(string[] args) { // ======演示最基本的反射===== // ITank tank = new HeavytTank(); // Type t = tank.GetType(); // object o = Activator.CreateInstance(t); // MethodInfo fireMI = t.GetMethod("Fire"); // MethodInfo runMI = t.GetMethod("Run"); // fireMI.Invoke(o, null); // runMI.Invoke(o, null); // ======反射的演示结束======= // ======演示依赖注入dependency injection(DI)===== // 容器注册 ServiceCollection sc = new ServiceCollection(); sc.AddScoped(typeof(ITank), typeof(HeavytTank)); sc.AddScoped(typeof(IVehicle), typeof(Car)); sc.AddScoped <Driver>(); ServiceProvider sp = sc.BuildServiceProvider(); // =============注册好了,之后可以使用配置好的容器了================ // 之后每次要的ITank利用的都是HeavyTank实例。 // 如果以后逻辑修改,比如ITank都要用MediumTank实现,直接改注册的地方就可以了。 // 假设没有使用这种容器的方法,而是每次都ITank tank= new HeavyTank();程序中使用了n次都要每次去修改 ITank tank = sp.GetService <ITank>(); tank.Fire(); tank.Run(); var driver = sp.GetService <Driver>();// Driver初始化需要IVehicle。容器会自动按已经注册的IVehicle的实例放进去生成Driver的实例 driver.Run(); Console.ReadKey(); }
static void Main(string[] args) { var sc = new ServiceCollection(); //One of the advantages of "dependency injection" is that we can easily substitute "HeavyTank" to "MediumTank" as the implementation class for "ITank" //when we've created a lot of "HeavyTank" in the program. If we use "new" to create instances, we need to change them one by one. sc.AddScoped(typeof(ITank), typeof(HeavyTank)); var sp = sc.BuildServiceProvider(); //................................. ITank tank = sp.GetService <ITank>(); tank.Run(); tank.Fire(); //This is another example. To create an instance for "Driver", we once need to create the instance for "IVehicle" first. //With the help of dependency injection, we just need to do "AddScoped()" and "GetService()". sc.AddScoped(typeof(IVehicle), typeof(LightTank)); sc.AddScoped <Driver>(); sp = sc.BuildServiceProvider(); var driver = sp.GetService <Driver>(); driver.Drive(); }