C# Unity IOC容器以及对象的生命周期设置
1、NuGet引入Unity和Unity.Configuration
2、
//默认注册方式:每次都构造一个新对象。
container.RegisterType<IStudentService, StudentService>();
//单例生命周期 : 通过容器构造对象,都是同一个。
container.RegisterType<IStudentService, StudentService>(new SingletonLifetimeManager());
//单线程单例 :同一个线程下同一个实例,不同线程就不同实例。
container.RegisterType<IStudentService, StudentService>(new PerThreadLifetimeManager());
默认注册方式:
/// <summary>
/// 默认
/// </summary>
private static void defaultIOC()
{
IUnityContainer container = new UnityContainer();//实例化容器
container.RegisterType<IStudentService, StudentService>();//容器注册 //默认 每次都构造一个新对象。(是瞬时生命周期 )
var service = container.Resolve<IStudentService>(); //获取实例1
var service2 = container.Resolve<IStudentService>(); //获取实例2
var isSame = object.ReferenceEquals(service, service2);//返回false
Console.WriteLine($"实例对比结果={isSame}");
}
单例生命周期
/// <summary>
/// 单例生命周期
/// using Unity.Lifetime;
/// 一般来说:当使用单例时候,不建议自己升级单例逻辑,直接用容器单例
/// </summary>
private static void SingletonIOC()
{
IUnityContainer container = new UnityContainer();//实例化容器
container.RegisterType<IStudentService, StudentService>(new SingletonLifetimeManager());//容器注册 单例生命周期
//单例生命周期 通过容器构造对象,都是同一个。
var service = container.Resolve<IStudentService>(); //获取实例1
var service2 = container.Resolve<IStudentService>(); //获取实例2
var isSame = object.ReferenceEquals(service, service2);//返回true
Console.WriteLine($"实例对比结果={isSame}");
}
单线程单例 :同一个线程下同一个实例,不同线程就不同实例。
/// <summary>
/// 单线程单例 :同一个线程下同一个实例,不同线程就不同实例。
/// </summary>
private static void PerThreadIOC()
{
IUnityContainer container = new UnityContainer();//实例化容器
container.RegisterType<IStudentService, StudentService>(new PerThreadLifetimeManager());//容器注册 单线程 单例
//单例生命周期 通过容器构造对象,都是同一个。
IStudentService service = container.Resolve<IStudentService>(); //获取实例1
IStudentService service2 = container.Resolve<IStudentService>(); //获取实例2
IStudentService service3 = null;
IStudentService service4 = null;
new Thread(o =>
{
Console.WriteLine($"线程={Thread.CurrentThread.ManagedThreadId},构造 service3");
service3 = container.Resolve<IStudentService>(); //获取实例3
new Thread(o =>
{
Console.WriteLine($"线程={Thread.CurrentThread.ManagedThreadId},构造 service4");
service4 = container.Resolve<IStudentService>(); //获取实例4
}).Start();
}).Start();
Thread.Sleep(200);
//输出结果
Console.WriteLine($"实例对比结果={object.ReferenceEquals(service, service2)}");//True
Console.WriteLine($"实例对比结果={object.ReferenceEquals(service, service3)}"); //false
Console.WriteLine($"实例对比结果={object.ReferenceEquals(service, service4)}"); //false
Console.WriteLine($"实例对比结果={object.ReferenceEquals(service3, service4)}");//false
}