IoC / DI 功能
控制反转 / 依赖注入已经逐渐成为软件的必备基础设施,软件功能的解耦、扩展都需要依赖它。而现在 .NET 上的 IoC / DI 框架也已经十分成熟,Glacier 提供了统一的依赖解析接口,集成了一个轻量级的 IoC / DI 框架,并且也提供对更复杂成熟的框架的对接,支持各种应用场景。
统一依赖解析接口
Glacier 统一了依赖解析接口,在需要一个接口的实现时,使用统一的语法来获取:
var foo = core.Resolver.Get<IFoo>();
var fooKeyed = core.Resolver.Get<IFoo>("key");
var barTyped = core.Resolver.Get(typeof(IBar));
var allBaz = core.Resolver.GetAll<IBaz>();
// 还有一些TryGet的方法来尝试解析
这里的Resolver
实现了IDependencyResolver
接口,这个接口抽象了 IoC / DI 框架的依赖解析方接口,类似于CommonServiceLocator,用来隔离不同 IoC / DI 框架的依赖解析方式,对开发者提供一致的外观。
实现
IDependencyResolver
接口目前有四个实现:
DefaultDependencyResolver
- 默认实现,使用集成的LightInjectLightInjectDependencyResolver
- 对接LightInject框架NinjectDependencyResolver
- 对接Ninject框架AutofacDependencyResolver
- 对接Autofac框架
用户也可以自行实现IDependencyResolver
接口,对接其它 IoC / DI 框架,然后对核心进行设置:
core.Resolver = new MyResolver(); // 设置单独核心的依赖解析
GlacierSystem.Resolver = new MyResolver(); // 设置全局核心的依赖解析
更多信息见Glacier 的文档。
集成的 IoC / DI 框架
Glacier使用代码方式集成了LightInject框架,内部功能使用它来组合。
LightInject 是一个非常高效的轻量级 IoC / DI 框架,适合用于其它框架内部。对于规模不大的应用,也可以在外部使用。
如果尚未接触过 IoC / DI 框架,或者使用过 LightInject,那么可以直接使用 Glacier 集成的 LightInject 框架:
// 推荐方式,使用 CompositionRoot 来统一注册服务:
class MyCompositionRoot : ICompositionRoot
{
public void Compose(IServiceRegistry serviceRegistry)
{
serviceRegistry.Register<IFoo, Foo>();
}
}
core.Source.RegisterFrom<MyCompositionRoot>();
// 获取时:
var foo = core.Resolver.Get<IFoo>();
对接的第三方 IoC / DI 框架
如前所述,Glacier 目前对接了三种第三方 IoC / DI 框架,LightInject、Ninject 和 Autofac。如果已经熟悉或者已经使用了它们,那么可以使用相应的对接来让 Glacier 支持它们。
这些对接都是独立的 NuGet 包,可以按需使用。
LightInject 对接
安装 GKarch.Ioc.LightInject4,在 VS 中使用
PM> Install-Package GKarch.Ioc.LightInject4
GKarch.Ioc.LightInject4 包,对接LightInject的 4.x 版本。(注:由于依赖的LightInject未签名,该程序集也未签名)
其提供LightInjectDependencyResolver
类,使用时
// container 为LightInject的IServiceContainer实现
core.Resolver = new LightInjectDependencyResolver(container);
Ninject 对接
安装 GKarch.Ioc.Ninject3,在 VS 中使用
PM> Install-Package GKarch.Ioc.Ninject3
GKarch.Ioc.Ninject3 包,对接Ninject的 3.x 版本。
其提供NinjectDependencyResolver
类,使用时
core.Resolver = new NinjectDependencyResolver(kernel); // kernel 为Ninject的IKernel实现
Autofac 对接
安装 GKarch.Ioc.Autofac3,在 VS 中使用
PM> Install-Package GKarch.Ioc.Autofac3
GKarch.Ioc.Autofac3 包,对接Autofac的 3.x 版本。
安装 GKarch.Ioc.Autofac4,在 VS 中使用
PM> Install-Package GKarch.Ioc.Autofac4
GKarch.Ioc.Autofac4 包,对接 Autofac 的 4.x 版本。
其提供AutofacDependencyResolver
类,使用时
core.Resolver = new AutofacDependencyResolver(container);
// container 为Autofac的IContainer实现