Unity有个很不错的特性就是支持延迟获取, 其本质是通过事先建立一个委托,然后再调用这个委托,看下下面的代码:
|
public
interface
IClass
{
void
ShowInfo();
}
public
class
MyClass : IClass
{
public
MyClass()
{
}
public
void
ShowInfo()
{
Console.WriteLine(
"这个是我的班级"
);
}
}
public static void DeferringResolve()
{
var resolver = container.Resolve<Func<IClass>>();
//根据业务逻辑做其他事情。
//注册IClass与MyClass之间的关系
container.RegisterType<IClass, MyClass>();
//获取MyClass实例
var myClass = resolver();
var resolver2 = container.Resolve<Func<IEnumerable<IClass>>>();
//根据业务逻辑做其他事情。
//注册与IClass相关的对象。
container.RegisterType<IClass, MyClass>( "my" );
container.RegisterType<IClass, YourClass>( "your" );
//获取与IClass关联的所有命名实例,非命名实例不会包含在内
var classList = resolver2();
}
|
这段代码演示了2个延迟获取的方式,都是通过将Func<T>放入Resolve<T>中来实现的,返回的是一委托,这样就可以在实际需要的时候再调用这个委托:
1、第一种是事先通过Resolve<Func<IClass>>(); 来定义获取与IClass关联的对象的委托,然后再注册IClass与MyClass之间的关系,然后再通过resolver(); 来获取。
2、第二种是事先通过Resolve<Func<IEnumerable<IClass>>>(); 来定义获取一个与IClass关联的命名实例列表的委托,然后调用相应的委托就可以一次性获取与IClass关联的所有命名实例。
这2种方式都很好的展示了Unity可以更加灵活的控制对象之间的注册与对象的调用。原文引用