使用Unity 实现依赖注入(4)

为了实现单例模式,我们通常的做法是,在类中定义一个方法如GetInstance,判断如果实例为null则新建一个实例,否则就返回已有实例。但是我觉得这种做法将对象的生命周期管理与类本身耦合在了一起。所以我觉得遇到需要使用单例的地方,应该将生命周期管理的职责转移到对象容器Ioc上,而我们的类依然是一个干净的类,使用Unity创建单例代码:

public static void FuTest07() { UnityContainer container = new UnityContainer();//创建容器 container.RegisterType<IWaterTool, PressWater>(new ContainerControlledLifetimeManager());//注册依赖对象 IPeople people = container.Resolve<VillagePeople>();//返回调用者 people.DrinkWater();//喝水 }

上面演示了将IWaterTool注册为PressWater,并声明为单例,

ContainerControlledLifetimeManager字面意思上就是Ioc容器管理声明周期,我们也可以不使用类型映射,将某个类注册为单例: 

container.RegisterType<PressWater>(new ContainerControlledLifetimeManager());

  除了将类型注册为单例,我们也可以将已有对象注册为单例,使用RegisterInstance方法,示例代码: 

PressWater pw = new PressWater(); container.RegisterInstance<IWaterTool>(pw);

上面的代码就表示将PressWater的pw对象注册到Ioc容器中��并声明为单例。

  如果我们在注册类型的时候没有指定ContainerControlledLifetimeManager对象,Resolve获取的对象的生命周期是短暂的,Ioc容器并不会保存获取对象的引用,就是说我们再次Resolve获取对象的时候,获取的是一个全新的对象,如果我们指定ContainerControlledLifetimeManager,类型注册后,我们再次Resolve获取的对象就是上次创建的对象,而不是再重新创建对象,这也就是单例的意思。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/72237947c0d18678115b7385d8d42331.html