Esempio n. 1
0
        static void Main(string[] args)
        {
            //Console.WriteLine("Hello World!");
            //IDIPContainer dIPContainer = new DIPContainer();
            #region IOC容器
            //dIPContainer.Register<IUserBLL, UserBLL>(paramlist: new object[] { "Lily", 5 });
            //dIPContainer.Register<IUserDAL, UserDAL>();
            //dIPContainer.Register<IUserDAL, UserDALMySql>("mysql");
            //dIPContainer.Register<IServiceA, ServiceA>(paramlist: new object[] { 43 });
            //dIPContainer.Register<IServiceB, ServiceB>();
            //dIPContainer.Register<IServiceC, ServiceC>();
            //dIPContainer.Register<IServiceD, ServiceD>();
            ////dIPContainer.Register<IUserBLL, UserBLL>();

            ////IUserDAL userDALMySql = dIPContainer.Resolve<IUserDAL>("mysql");
            //IUserBLL userBLL = dIPContainer.Resolve<IUserBLL>();

            #endregion            //IUserDAL userDAL = ObjectFactory.CreateDAL();

            // dIPContainer.Register<IServiceB, ServiceB>(lifeTimeType: LifeTimeType.PerThread);

            // IServiceB serviceB1 = dIPContainer.Resolve<IServiceB>();
            // IServiceB serviceB2 = dIPContainer.Resolve<IServiceB>();

            // //IDIPContainer container1 = dIPContainer.CreateSubDIPContainer();
            // //IDIPContainer container2 = dIPContainer.CreateSubDIPContainer();

            // //IServiceB serviceB11 = container1.Resolve<IServiceB>();
            // //IServiceB serviceB12 = container1.Resolve<IServiceB>();
            // //IServiceB serviceB21 = container2.Resolve<IServiceB>();
            // //IServiceB serviceB22 = container2.Resolve<IServiceB>();

            // //Console.WriteLine(object.ReferenceEquals(serviceB1, serviceB2));
            // //Console.WriteLine(object.ReferenceEquals(serviceB11, serviceB21));
            // //Console.WriteLine(object.ReferenceEquals(serviceB12, serviceB22));
            // //Console.WriteLine(object.ReferenceEquals(serviceB11, serviceB12));
            // //Console.WriteLine(object.ReferenceEquals(serviceB21, serviceB22));

            // IServiceB serviceB3 = null;
            // IServiceB serviceB4 = null;
            // IServiceB serviceB5 = null;

            // //Task.Run(() =>
            // //{
            // //    Console.WriteLine($" B3 This is Thread {Thread.CurrentThread.ManagedThreadId}");
            // //    serviceB3 = dIPContainer.Resolve<IServiceB>();
            // //});
            // Task.Run(() =>
            // {
            //     Console.WriteLine($" B4 This is Thread {Thread.CurrentThread.ManagedThreadId}");
            //     serviceB4 = dIPContainer.Resolve<IServiceB>();
            // }).ContinueWith(t =>
            // {
            //     //Task.Run(() =>
            //     //{
            //     Console.WriteLine($"B5 This is Thread {Thread.CurrentThread.ManagedThreadId}");
            //     serviceB5 = dIPContainer.Resolve<IServiceB>();
            //     //});
            // }
            //).GetAwaiter().GetResult();
            // Thread.Sleep(1000);
            // CustomCallContext<object>.ShowValue();
            // Console.WriteLine(object.ReferenceEquals(serviceB1, serviceB2));
            // Console.WriteLine(object.ReferenceEquals(serviceB1, serviceB3));
            // Console.WriteLine(object.ReferenceEquals(serviceB1, serviceB4));
            // Console.WriteLine(object.ReferenceEquals(serviceB1, serviceB5));
            // Console.WriteLine(object.ReferenceEquals(serviceB2, serviceB3));
            // Console.WriteLine(object.ReferenceEquals(serviceB2, serviceB4));
            // Console.WriteLine(object.ReferenceEquals(serviceB2, serviceB5));
            // Console.WriteLine(object.ReferenceEquals(serviceB3, serviceB4));
            // Console.WriteLine(object.ReferenceEquals(serviceB3, serviceB5));
            // Console.WriteLine(object.ReferenceEquals(serviceB4, serviceB5));

            //IUserBLL userBLL = ObjectFactory.CreateBLL(userDAL);
            //UserModel userModel= userBLL.Login("Administrator");
            //Console.WriteLine(userModel.Name);

            //CustomAOPTest.Show();
            IDIPContainer dIPContainer = new DIPContainer();
            dIPContainer.Register <IServiceB, ServiceB>(lifeTimeType: LifeTimeType.Singleton);
            IServiceB serviceB = dIPContainer.Resolve <IServiceB>();
            serviceB.SayHello();
            serviceB.SayWhy();
            serviceB = (IServiceB)ContainerAOPExtend.AOP(serviceB, typeof(IServiceB));
            serviceB.SayHello();
            serviceB.SayWhy();
        }
Esempio n. 2
0
        private object ResolveObject(Type abstracttype, string shortname = null, object[] paramlist = null)
        {
            //string key = abstracttype.FullName;
            string key = GetKey(abstracttype.FullName, shortname);

            if (DIPContainerDic.ContainsKey(key))
            {
                RegisterModel registerModel = DIPContainerDic[key];
                Type          type          = registerModel.ModelType;
                switch (registerModel.LifeType)
                {
                case LifeTimeType.Transient:
                    Console.WriteLine("瞬时实例--前");
                    break;

                case LifeTimeType.Singleton:
                    if (registerModel.SingletonInstance == null)
                    {
                        break;
                    }
                    else
                    {
                        return(registerModel.SingletonInstance);
                    }

                case LifeTimeType.Scoped:
                    if (!DIPContainerScoped.ContainsKey(key) || DIPContainerScoped[key] == null)
                    {
                        break;
                    }
                    else
                    {
                        return(DIPContainerScoped[key]);
                    }

                case LifeTimeType.PerThread:
                    object threadobject = CustomCallContext <object> .GetData($"{key}{Thread.CurrentThread.ManagedThreadId}");

                    Console.WriteLine($"{key}{Thread.CurrentThread.ManagedThreadId}");
                    Console.WriteLine($"threadobject:{threadobject}");
                    if (threadobject == null)
                    {
                        break;
                    }
                    else
                    {
                        return(threadobject);
                    };

                default:
                    break;
                }
                #region 准备构造函数的参数
                //获取指定标记特性的构造函数
                ConstructorInfo ctor = type.GetConstructors().FirstOrDefault(m => m.IsDefined(typeof(DIPContainerAttribute), true));
                //找到构造函数中参数最多的
                if (ctor == null)
                {
                    ctor = type.GetConstructors().OrderByDescending(c => c.GetParameters().Length).First();
                }
                //获取第一个构造函数
                //var ctor = type.GetConstructors()[0];

                List <object> list         = new List <object>();
                object[]      paraConstant = DIPContainerValueDic.ContainsKey(key) ? DIPContainerValueDic[key] : null;
                int           index        = 0;
                foreach (var para in ctor.GetParameters())
                {
                    if (para.IsDefined(typeof(DIPParameterConstantAttribute), true))
                    {
                        list.Add(paraConstant[index++]);
                    }
                    else
                    {
                        Type   paraType       = para.ParameterType;
                        object objectInstance = ResolveObject(paraType);
                        list.Add(objectInstance);
                    }
                    //string paraKey = paraType.FullName;
                    //if (DIPContainerDic.ContainsKey(paraKey))
                    //{
                    //    Type paraTargetType = DIPContainerDic[paraKey];
                    //    list.Add(Activator.CreateInstance(type));
                    //}
                    //else
                    //{
                    //    //DIPContainerDic.Add(paraKey, ()Activator.CreateInstance(type));
                    //}
                }
                #endregion

                object oInstance = Activator.CreateInstance(type, list.ToArray());

                #region 准备构造函数的属性,通过属性标记
                foreach (var property in type.GetProperties().Where(m => m.IsDefined(typeof(DIPPropertyInjectionAttribute), true)))
                {
                    Type   propType      = property.PropertyType;
                    string parashortname = GetShortName(property);
                    object propInstance  = ResolveObject(propType, parashortname);
                    property.SetValue(oInstance, propInstance);
                }
                #endregion

                #region 准备构造函数的方法,通过属性标记
                int methodindex = 0;
                foreach (var method in type.GetMethods().Where(m => m.IsDefined(typeof(DIPMethodInjectionAttribute), true)))
                {
                    List <object>   listmethod     = new List <object>();
                    ParameterInfo[] parameterInfos = method.GetParameters();
                    foreach (var parameterInfo in parameterInfos)
                    {
                        if (parameterInfo.IsDefined(typeof(DIPParameterConstantAttribute), true))
                        {
                            listmethod.Add(paraConstant[methodindex++]);
                        }
                        else
                        {
                            Type   methodType    = parameterInfo.ParameterType;
                            string parashortname = GetShortName(method);

                            object methodInstance = ResolveObject(methodType, parashortname);
                            listmethod.Add(methodInstance);
                        }
                    }

                    method.Invoke(oInstance, listmethod.ToArray());
                }
                #endregion
                switch (registerModel.LifeType)
                {
                case LifeTimeType.Transient:
                    Console.WriteLine("瞬时实例--后");
                    break;

                case LifeTimeType.Singleton:
                    //registerModel.SingletonInstance = oInstance;
                    registerModel.SingletonInstance = ContainerAOPExtend.AOP(oInstance, abstracttype);
                    break;

                case LifeTimeType.Scoped:
                    //DIPContainerScoped[key] = oInstance;
                    DIPContainerScoped[key] = ContainerAOPExtend.AOP(oInstance, abstracttype);
                    break;

                case LifeTimeType.PerThread:
                    CustomCallContext <object> .SetData($"{key}{Thread.CurrentThread.ManagedThreadId}", oInstance);

                    break;

                default:
                    break;
                }

                //return oInstance;
                return(ContainerAOPExtend.AOP(oInstance, abstracttype));
            }
            else
            {
                return(null);
            }
        }