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(); }
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); } }