Ejemplo n.º 1
0
        private static void ContainerRegisterScope()
        {
            //Http请求---Asp.NetCore内置Kestrel,初始化一个容器实例;然后每次来一个Http请求,就clone一个,或者叫创建子容器(包含注册关系),然后一个请求就一个新作用域(容器)实例,那么就可以做到作用域单例了(其实就是子容器单例)
            //下面模拟从同一个作用域容器里进行实例化,注意这里并没有真正实现在同一个Http请求下的处理,真正的处理需要进行请求的区分,然后同一个请求下的实例化要使用同一个子容器对象。
            //如果想真正实现区分http请求的域范围容器,要参考一下.NetCore的IOC实现方法。

            Container container = new Container();

            container.RegisterScope <ITestDI01, TestDI01>();

            Container scopeContainer = container.CreateScopeContainer();

            ITestDI01 t01 = scopeContainer.Resolve <ITestDI01>();
            ITestDI01 t02 = scopeContainer.Resolve <ITestDI01>();

            Console.WriteLine(object.ReferenceEquals(t01, t02));
        }
Ejemplo n.º 2
0
        private static void ContainerRegisterThread()
        {
            Container container = new Container();

            container.RegisterThread <ITestDI01, TestDI01>();
            ITestDI01 t01 = null;
            ITestDI01 t02 = null;
            ITestDI01 t03 = null;
            ITestDI01 t04 = null;
            ITestDI01 t05 = container.Resolve <ITestDI01>();
            ITestDI01 t06 = container.Resolve <ITestDI01>();

            List <Task> tasks = new List <Task>();

            tasks.Add(
                Task.Run(() =>
            {
                Console.WriteLine($"This is {Thread.CurrentThread.ManagedThreadId} 1");
                t01 = container.Resolve <ITestDI01>();
                t02 = container.Resolve <ITestDI01>();
            }).ContinueWith((t) =>
            {
                Console.WriteLine($"This is {Thread.CurrentThread.ManagedThreadId} 2");
                t03 = container.Resolve <ITestDI01>();
            })
                );
            tasks.Add(
                Task.Run(() =>
            {
                Console.WriteLine($"This is {Thread.CurrentThread.ManagedThreadId} 3");
                t04 = container.Resolve <ITestDI01>();
            }));

            Thread.Sleep(1000);

            Task.WaitAll(tasks.ToArray());

            Console.WriteLine(object.ReferenceEquals(t01, t02));
            Console.WriteLine(object.ReferenceEquals(t01, t03));
            Console.WriteLine(object.ReferenceEquals(t01, t04));
            Console.WriteLine(object.ReferenceEquals(t01, t05));
            Console.WriteLine(object.ReferenceEquals(t06, t05));
        }
Ejemplo n.º 3
0
 public TestDI02(ITestDI01 testDI01)
 {
     this._iTestDI01 = testDI01;
     Console.WriteLine($"{this.GetType().Name}被构造。。。");
 }
Ejemplo n.º 4
0
 //这里的值类型参数,在ioc容器中注册,实现起来会有障碍,需要在实例化时候必须指定值
 public TestDI03(ITestDI01 testDI01, ITestDI02 testDI02, int i)
 {
     this._iTestDI01 = testDI01;
     this._iTestDI02 = testDI02;
     Console.WriteLine($"{this.GetType().Name}({i})被构造。。。");
 }