Maison  >  Article  >  développement back-end  >  Réflexion et COI

Réflexion et COI

黄舟
黄舟original
2017-02-23 09:46:482182parcourir

Réflexion

Le mécanisme de réflexion est en cours d'exécution Pour n'importe quelle classe, il peut connaître tous les attributs et attributs de. cette classe. Méthode ; pour n'importe quel objet, n'importe laquelle de ses méthodes peut être appelée ; cette fonction d'obtention dynamique et d'appel dynamique des méthodes de l'objet est appelée le mécanisme de réflexion. Le mécanisme de réflexion obtient et utilise dynamiquement des méthodes, ce qui est complètement différent de la création directe d'un objet d'une classe et de son appel direct. Par exemple, s'il existe une propriété ou une méthode dans une classe qui est privée, nous ne pouvons pas l'appeler directement, mais nous pouvons utiliser le mécanisme de réflexion pour l'appeler dynamiquement.

IOC

Le plus grand avantage d'IOC est de mettre la génération d'objets on Il est défini en XML, donc lorsque nous aurons besoin de changer une sous-classe d'implémentation, cela deviendra très simple (généralement, ces objets sont implémentés dans une sorte d'interface), il suffit de modifier le XML, afin que nous puissions même réaliser la nouveauté du objet Branchez et débranchez (un peu comme l’interface USB et le disque dur SCSI). Avant que IOC ne soit applicable, si un objet dépend d'un autre objet (ci-après dénommé objet dépendant et objet dépendant), nous devons instancier un objet dépendant dans l'objet dépendant afin que la méthode dans l'objet dépendant puisse être appelée. Évidemment, ce degré de couplage est relativement élevé et n'est pas conforme à nos principes de programmation. Par conséquent, nous allons maintenant introduire un objet tiers, qui est chargé de fournir directement un objet dépendant à l'objet dépendant, réduisant ainsi le couplage entre les deux. La figure ci-dessous montre la comparaison du couplage d'objets dans le système avant et après l'ajout du conteneur IOC


Avant l'introduction du conteneur IOC dans le système logiciel, comme le montre la figure 1, l'objet A dépend de l'objet B. Ensuite, l'objet A doit le créer activement lorsqu'il est initialisé ou s'exécute jusqu'à un certain point ou utilise un objet B déjà créé. Que vous créiez ou utilisiez l’objet B, le contrôle est entre vos mains.
Après l'introduction du conteneur IOC dans le système logiciel, cette situation a complètement changé. Comme le montre la figure 2, en raison de l'ajout du conteneur IOC, la connexion directe entre l'objet A et l'objet B a été perdue. A s'exécute lorsque l'objet B est nécessaire, le conteneur IOC crée activement un objet B et l'injecte à l'emplacement où l'objet A est nécessaire.
Grâce à la comparaison avant et après, il n'est pas difficile de voir que le processus de dépendance de l'objet A à l'objet B passe d'un comportement actif à un comportement passif, et que les droits de contrôle sont inversés. C'est l'origine du nom ". Inversion du contrôle".

Instance

Code de l'instance de réflexion


<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace StudentDAL
{
    public class Student
    {
        //属性
        public string Name{get;set;}
        public int Age { get; set; }

        //无参数构造函数
        public Student()
        {
            this.Name = "无参数";
            this.Age = 0;

        }
        //有参数构造函数
        public Student(string name, int age)
        {
            this.Name = "name";
            this.Age = age;
        }

        //public带参带返回值函数
        public string PublishMethodReturn()
        {
            return string.Format("我叫"+Name+"年龄" +Age);
        }
    }
}</strong></span>
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;

namespace ITOO_Reflection
{
    class Program
    {
        static void Main(string[] args)
        {
            //使用 Assembly 定义和加载程序集,
            //加载在程序集清单中列出的模块,
            //以及从此程序集中查找类型并创建该类型的实例.
            //获取程序集
            Assembly assembly = Assembly.Load("StudentDAL");
            //从程序及获取指定对象类型
            Type type = assembly.GetType("StudentDAL.Student");
            var instance = assembly.CreateInstance("StudentDAL.Student");
            //为学生类的属性赋值
            type.GetProperty("Name").SetValue(instance, "shx", null);
            type.GetProperty("Age").SetValue(instance, 18, null);
            //获取Student类的方法
            var method = type.GetMethod("PublishMethodReturn");
            //调用Student类的成员方法PublishMethodReturn
            var S= method.Invoke(instance, null);
          
            Console.WriteLine(S);
            Console.Read();
        }
    }
}</strong></span>


Résultat en cours



Exemple de code CIO



<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ITOO.IOC.IDAL
{
    public interface IUserDal
    {
        void HelloWord();
    }
}
</strong></span>
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ITOO.IOC.IDAL;

namespace ITOO.IOC.DAL
{
    public class User:IUserDal
    {
        public void HelloWord()
        {
            Console.WriteLine("helloword");
        }
    }
}
</strong></span>
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ITOO.IOC.IBLL
{
    public interface IUserBll
    {
        void HelloWord();
    }
}
</strong></span>
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ITOO.IOC.IBLL;
using ITOO.IOC.IDAL;
using ITOO.Library.Core.AOP;

namespace ITOO.IOC.BLL
{
    public class UserBll:IUserBll
    {
        public void HelloWord()
        {
            //使用底层封装的SpringHelper从IOC容器中拿到D层的类的对象实例
            IUserDal iuser = SpringHelper.GetObject<IUserDal>("User");
            iuser.HelloWord();
        }
    }
}
</strong></span>
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ITOO.IOC.IBLL;
using ITOO.Library.Core.AOP;

namespace ITOO.IOC.Client
{
    class Program
    {
        static void Main(string[] args)
        {
            //客户端通过底层封装的SpringHelper从IOC容器中根据B层类的对象的id拿到UserBll类的实例
            IUserBll iuserbll = SpringHelper.GetObject<IUserBll>("UserBll");
            //调用UserBll类的方法
            iuserbll.HelloWord();
            Console.Read();
        }
    }
}
</strong></span>


Exécuter les résultats



Ce qui précède est le contenu de la réflexion et du CIO. Pour plus de contenu connexe, veuillez prêter attention à. le site PHP chinois (www .php.cn) !



Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn