Exemple #1
0
        private void Test01()
        {
            IUnityContainer container = new UnityContainer();

            container.RegisterType <IPhone, AndroidPhone>();                   //接口
            container.RegisterType <AbstractPad, ApplePad>();                  //抽象类
            //container.RegisterType<ApplePad, ApplePadChild>();//子父类  会覆盖<AbstractPad, ApplePad>
            container.RegisterType <AbstractPad, ApplePad>("child");           //1对多
            container.RegisterType <AbstractPad, ApplePadChild>("grandchild"); //1对多
            container.RegisterInstance <ITV>(new AppleTV());                   //注册实例  但不常用
            IPhone      phone         = container.Resolve <IPhone>();
            AbstractPad abstractPad   = container.Resolve <AbstractPad>();
            AbstractPad childApplePad = container.Resolve <AbstractPad>("child");
            AbstractPad grandchild    = container.Resolve <AbstractPad>("grandchild");
        }
 //[ElevenInjectionConstructor]
 public AndroidPhone(AbstractPad pad)
 {
     Console.WriteLine("{0}构造函数", this.GetType().Name);
 }
Exemple #3
0
        public static void Show()
        {
            {
                Console.WriteLine("=====Basic Usage of Unity=========");
                IUnityContainer container = new UnityContainer(); //1. Declare a container
                container.RegisterType <IPhone, AndriodPhone>();  //2. Initiate the container, register the type
                                                                  // This is an interface
                IPhone phone = container.Resolve <IPhone>();      //3. Create an object by reflection
                phone.Call();

                container.RegisterType <AbstractPad, ApplePad>(); // This is an abstract class
                AbstractPad pad = container.Resolve <AbstractPad>();
                pad.Show();

                container.RegisterType <ApplePad, ApplePadChild>(); //This is an example of parent and child
                ApplePad applePad = container.Resolve <ApplePad>();
                applePad.Show();

                //One to many
                container.RegisterType <AbstractPad, ApplePad>("childPad"); //One to many, use alias
                container.RegisterType <AbstractPad, ApplePadChild>("grandChildPad");
                var childPad      = container.Resolve <AbstractPad>("childPad");
                var grandChildPad = container.Resolve <AbstractPad>("grandChildPad");
                childPad.Show();
                grandChildPad.Show();

                //Register an instance
                container.RegisterInstance <ITV>(new AppleTV(123));
                var tv = container.Resolve <ITV>();
                tv.Show();
                Console.WriteLine("====End of basic utility===");
            }

            {
                Console.WriteLine("====Dependency injection, implementing multi layer structure ====");
                IUnityContainer container = new UnityContainer();
                container.RegisterType <IPhone, ApplePhone>();
                container.RegisterType <IMicrophone, Microphone>();
                container.RegisterType <IPower, Power>();
                container.RegisterType <IHeadphone, Headphone>();
                container.RegisterType <IBaseDAL, BaseDAL>();
                IPhone phone = container.Resolve <IPhone>();
                phone.Call();
                Console.WriteLine("====End of dependency injection====");
            }

            {
                Console.WriteLine("====Life circly management====");
                IUnityContainer container = new UnityContainer();
                container.RegisterType <IPhone, AndriodPhone>();                                         //Default is transient lifecycle
                container.RegisterType <IPhone, AndriodPhone>(new TransientLifetimeManager());
                container.RegisterType <IPhone, AndriodPhone>(new ContainerControlledLifetimeManager()); //container implement sigleton method
                var phone1 = container.Resolve <IPhone>();
                var phone2 = container.Resolve <IPhone>();
                Console.WriteLine(object.ReferenceEquals(phone1, phone2)); // in transient mode, return false; in container controll mode, return true.

                {
                    Console.WriteLine("====Singleton mode in a thread"); // The instances in same thread is same one.
                    container.RegisterType <IPhone, AndriodPhone>(new PerThreadLifetimeManager());
                    IPhone iphone1 = null;
                    Action act1    = new Action(() =>
                    {
                        iphone1 = container.Resolve <IPhone>();
                        Console.WriteLine($"iphone1 is created by thread: {Thread.CurrentThread.ManagedThreadId}");
                    });

                    var result1 = act1.BeginInvoke(null, null);

                    IPhone iphone2 = null;
                    Action act2    = new Action(() =>
                    {
                        iphone2 = container.Resolve <IPhone>();
                        Console.WriteLine($"iphone2 is created by thread: {Thread.CurrentThread.ManagedThreadId}");
                    });

                    IPhone iphone3 = null;

                    var result2 = act2.BeginInvoke(t =>
                    {
                        iphone3 = container.Resolve <IPhone>();
                        Console.WriteLine($"iphone1 is created by thread: {Thread.CurrentThread.ManagedThreadId}");
                        Console.WriteLine($"object.ReferenceEquals(iphone2, iphone3)={object.ReferenceEquals(iphone2, iphone3)}");
                    }, null);

                    act1.EndInvoke(result1);
                    act2.EndInvoke(result2);

                    //iphone1 and iphone2 are created by same thread, so they are equal
                    Console.WriteLine($"iphone1 is equals to iphone2 is {object.ReferenceEquals(iphone1, iphone2)}");
                }

                {
                    Console.WriteLine("===Each layer container's singleton model=====");
                    container.RegisterType <IPhone, AndriodPhone>(new HierarchicalLifetimeManager());
                    IUnityContainer childContainer = container.CreateChildContainer();
                }

                {
                    Console.WriteLine("====Releaseable singleton from outside====");
                    container.RegisterType <IPhone, AndriodPhone>(new ExternallyControlledLifetimeManager());
                }

                {
                    Console.WriteLine("====Recycle referenced container====");
                    container.RegisterType <IPhone, AndriodPhone>(new PerResolveLifetimeManager());
                }

                {
                    Console.WriteLine("====Create container from configuration file====");
                    ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
                    fileMap.ExeConfigFilename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "CfgFiles\\Unity.Config");
                    Configuration             configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
                    UnityConfigurationSection section       = (UnityConfigurationSection)configuration.GetSection(UnityConfigurationSection.SectionName);

                    //IUnityContainer containerF = new UnityContainer();
                    //section.Configure(containerF, "testContainer");
                    //IPhone phone = containerF.Resolve<IPhone>();
                    //phone.Call();

                    Console.WriteLine("====Extend class Android phone====");

                    //IUnityContainer containerE = new UnityContainer();
                    //section.Configure(containerE, "testContainerE");
                    //IPhone phoneE = containerF.Resolve<IPhone>();
                    //phoneE.Call();

                    Console.WriteLine("====IOC + AOP from config file====");
                    IUnityContainer containerAOP = new UnityContainer();
                    section.Configure(containerAOP, "testContainerAOP");
                    IPhone phoneAOP = containerAOP.Resolve <IPhone>();
                    phoneAOP.Call();

                    //IPhone android = containerF.Resolve<IPhone>("Android");
                    //android.Call();
                }

                {
                }
            }
        }
Exemple #4
0
        public void Test()
        {
            {
                IUnityContainer container = new UnityContainer();
                ////container.RegisterType<IPhone,AndroidPhone>();//接口注册
                ////container.RegisterType<AbstractPad, ApplePad>();//抽象类注册
                ////container.RegisterType<ApplePad, ApplePadChild>();//普通继承类注册
                ////IPhone iphone = container.Resolve<IPhone>();
                ////AbstractPad abstractPad = container.Resolve<AbstractPad>();
                ////ApplePad applePad = container.Resolve<ApplePad>();

                #region 依赖注入
                //全局单例生命周期
                //container.RegisterType<AbstractPad, ApplePad>(new SingletonLifetimeManager());
                #region 线程单例

                /*其中pad1是一个子线程
                 * pad3是pad2的回调,所以处于一个线程中
                 */
                container.RegisterType <AbstractPad, ApplePad>(new PerThreadLifetimeManager());
                AbstractPad pad1 = null;
                AbstractPad pad2 = null;
                AbstractPad pad3 = null;
                Action      act1 = new Action(() =>
                {
                    pad1 = container.Resolve <AbstractPad>();
                });
                act1.BeginInvoke(null, null);

                Action act2 = new Action(() =>
                {
                    pad2 = container.Resolve <AbstractPad>();
                });
                act2.BeginInvoke(t =>
                {
                    pad3 = container.Resolve <AbstractPad>();
                }, null);

                object.ReferenceEquals(pad1, pad2); //false,不同的线程对象
                object.ReferenceEquals(pad2, pad3); //true,线程对象

                #endregion

                container.RegisterType <IPhone, ApplePhone>();
                container.RegisterType <IPhone, ApplePhone>();
                container.RegisterType <IHeadPhone, AppleHeadPhone>();
                container.RegisterType <IMicrophone, Mircophone>();
                container.RegisterType <IPower, Power>();
                //默认是瞬时生命周期
                IPhone iphone        = container.Resolve <IPhone>();
                IPhone iphone2       = container.Resolve <IPhone>();
                bool   compareResult = object.ReferenceEquals(iphone, iphone2);//false,不同的对象
                IPower power         = container.Resolve <IPower>();
                iphone.Init(power);
                #endregion
            }
            {
                //IDavidCustomContainer container = new DavidCustomContainer();
                //container.RegisterType<IPhone, AndroidPhone>();
                //container.RegisterType<AbstractPad, ApplePad>();
                //container.RegisterType<IHeadPhone, AppleHeadPhone>();
                //container.RegisterType<IPower, Power>();
                //IPhone phone = container.Resolve<IPhone>();
            }
        }