课件和 Demo 地址
https://gitee.com/geektime-geekbang/NET-Core
作者回复: 对于方法都是线程安全的类型,一般使用单例。 对于对象依赖了处理上下文,或者使用了有限资源(如数据库连接),一般使用Scoped或者Transient。 Scoped、Transient的区别是你在同一个上下文中是否期望使用同一个实例,如果是,用Scoped,反之则使用Transient
作者回复: 工厂模式可以让你自由控制构造对象的过程,例如当你构造实例的过程比较复杂,需要特别的逻辑处理或组装时。 另外一个场景是当你已经有了一个对象的实例、或者容器中已经有了某个对象,这个对象实现了多个接口或基类,你需要注册这几个接口为同一实例时,也可以用工厂。
作者回复: 例如管理数据库连接对象,每个用户请求范围内,使用同一个实例,处理响应完毕,由容器帮忙释放
作者回复: 需要遍历,根据实际类型来判断。 如果特别需要对同一服务注册不同的类型并加以区分的话,可以使用第三方的依赖注入框架,支持命名注册
作者回复: 实际场景中,线上环境通过修改配置来切换依赖注入的方式比较少见,一般依赖修改还涉及到包的依赖和回归测试,因此用配置文件没有明显优势。
作者回复: 服务会被多次注册,GetServce获取服务时,会得到最后注册的那个,使用GetServces会得到所有注册的,与你注册顺序相同
作者回复: 从你的描述来看,你需要确定这两个需求是否是不同角色的诉求,或者是否是在解决不同的问题。 如果是,则分别设计API。 如果不是,说明两个业务诉求的目的是一致的,应该用一个接口可以满足。 不建议通过字段当作权限来判断不同的逻辑,这样会把两个不同的需求,耦合在一个API中。
作者回复: 类似下面的代码,后面的章节有提到 IServiceCollection serviceCollection = new ServiceCollection(); //创建容器注册集合 IServiceProvider service = serviceCollection.BuildServiceProvider(); //构建容器
作者回复: 推荐阅读一下官方文档https://docs.microsoft.com/zh-cn/
作者回复: Autofac 提供了 RegisterAssemblyTypes 能力可以实现类似的能力