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)); }
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)); }
public TestDI02(ITestDI01 testDI01) { this._iTestDI01 = testDI01; Console.WriteLine($"{this.GetType().Name}被构造。。。"); }
//这里的值类型参数,在ioc容器中注册,实现起来会有障碍,需要在实例化时候必须指定值 public TestDI03(ITestDI01 testDI01, ITestDI02 testDI02, int i) { this._iTestDI01 = testDI01; this._iTestDI02 = testDI02; Console.WriteLine($"{this.GetType().Name}({i})被构造。。。"); }