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 - 默认实现,使用集成的LightInject
  • NinjectDependencyResolver - 对接Ninject框架
  • AutofacDependencyResolver - 对接Autofac框架

用户也可以自行实现IDependencyResolver接口,对接其它 IoC / DI 框架,然后对核心进行设置:

core.Resolver = new MyResolver();        // 设置单独核心的依赖解析
GlacierCore.Resolver = new MyResolver(); // 设置全局核心的依赖解析

更多信息见Core的文档

集成的 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 c = ((DefaultDependencyResolver)core.Resolver).Container;
c.Register<IFoo, Foo>();

// 获取时:
var foo = core.Resolver.Get<IFoo>();

对接的第三方 IoC / DI 框架

如前所述,Glacier 目前对接了两种第三方 IoC / DI 框架,Ninject 和 Autofac。如果已经熟悉或者已经使用了它们,那么可以使用相应的对接来让 Glacier 支持它们。

这些对接都是独立的 NuGet 包,可以按需使用。

Ninject 对接

GKarch.Glacial.Ninject3 包,对接Ninject的 3.x 版本。

其提供NinjectDependencyResolver类,使用时

core.Resolver = new NinjectDependencyResolver(kernel); // kernel 为Ninject的IKernel实现

Autofac 对接

GKarch.Glacial.Autofac3 包,对接Autofac的 3.x 版本。

GKarch.Glacial.Autofac4 包,对接 Autofac 的 4.x 版本。

其提供AutofacDependencyResolver类,使用时

core.Resolver = new AutofacDependencyResolver(container);
// container 为Autofac的IContainer实现