StyletIoC介绍
StyletIoC是一个非常轻量级和非常快速的IoC容器。它被设计为只做几件事,但以直观的方式把它们做好。
它使用流畅的接口进行配置——没有XML垃圾。它也没有依赖性。
我现在假设您对IoC容器的概念相当有信心——如果没有,请阅读一些内容并返回。我以后可能会写一篇更深入的介绍。
服务和实施
StyletIoC是围绕服务的概念构建的。服务是一种具体类型、抽象类型或接口,由具体类型实现(或可以实现),例如:
interface IVehicle { ... }
class HotHatchback : IVehicle { ... }
这里,IVehicle
是服务,而HotHatchback
是实现它的具体类型。请注意,HotHatchback
也是一个服务-一个由HotHatchack
类本身实现的服务。
当您配置StyletIoC时,您定义了一组关系。每个关系都是在一个服务和实现它的类型之间。因此,在这里,我们可以告诉StyletIoC“在服务IVehicle
和类型HotHatchback
之间创建一个关系”。
稍后,当您想要实现IVehicle
时,您可以要求StyletIoC“给我一个实现服务IVehicl
的实例,StyletIoC将构造一个HotHatchback
并将其传递回您。
解析类型-服务定位器和注入
有三种方法可以让StyletIoC为我们构造类型:
- 通过直接调用
IContainer.Get
- 构造器注入
- 属性注入(Property Injection)
直接调用IContainer.Get
是最容易解释的,如下所示:
var ioc = ... // Covered in lots of detail elsewhere
var vehicle = ioc.Get<IVehicle>();
尽管这看起来很诱人,但这应该只在应用程序的根目录中完成——在其他地方使用构造函数注入和参数注入。
当StyletIoC为您构造类型时,它将寻找一个构造函数,该构造函数具有它知道如何解析的类型参数。然后,它将解析这些类型,并将它们注入构造函数。例如:
class Engine { ... }
class Car
{
public Car(Engine engine)
{
// 'engine' contains a new instance of Engine
}
}
这是StyletIoC中新实例的最常见方式-StyletIoC构造的每一种类型都在其构造函数中列出其依赖项,StyletIO将构造其中的每一个,同时注入其依赖项。
如果您愿意,您也可以进行参数注入,前提是要注入的参数具有属性[Inject]
,例如:
class Engine { ... }
class Car
{
[Inject]
public Engine Engine { get; set; }
}
每种方法的不同优点在其他地方讨论。