为什么要在内置的ASP.NET Core DI容器上使用第三方DI容器?
目前缺乏关于DI主题 – dependency injection的文档。 有人可以帮我理解以下几点:
-
这些注册有什么区别?
public void ConfigureServices(IServiceCollection services) { services.AddTransient<IService, Service>(); services.AddScoped<IService, Service>(); services.AddSingleton<IService, Service>(); services.AddInstance(service); }
- (NInject,Autofac,Structure Map)等现有解决scheme使用内置DI的优缺点是什么?
- 什么是当前的默认dependency injection(如果有的话)的限制?
对于遵循SOLID原则的任何相当大的应用程序的产品开发,vNext的内置DI容器将是无用的,因为:
- 它不会帮助您validation您的configuration,因此很难诊断常见错误configuration(例如, Captive Dependencies)带来的问题 。 在一个合理大小的应用程序中,实际上很难自己发现这些错误。
- 使用拦截器或装饰器来应用交叉关注是不可能的。 这使得维护任何合理大小的应用程序都非常昂贵。
- 虽然它支持将开放generics抽象映射到开放generics实现,但它不能使用带有types约束的genericstypes。
- 要进行条件注册是不可能的,注册只能注入一定的消费者。
如果您从一个新的简单的项目开始,我的build议是应用Pure DI (意味着不使用容器的手持式组件),并通过插入您的自定义IControllerActivator来解决您的types。 稍后,当批注册和修饰等function将改进组合根目录的可维护性时,请切换到适合您要求的其中一个已build立的DI库。
这里解释:
- 瞬态 – 每次创build一个新的实例
- 作用域 – 在当前作用域内创build一个实例。 它相当于当前范围内的Singleton
- Singleton – 创build一个实例,它就像一个单例
- 实例 – 一个特定的实例被一直给予。 您对其初始创作负责
Alpha版本有这样的限制:
- 它只支持构造函数注入
- 它只能用一个公共的构造函数来parsingtypes
- 它不支持高级function(如每个线程范围或自动发现)
如果你没有写出真正复杂的产品默认DI容器应该足够你。 在其他情况下,您可以尝试已经提到的具有高级function的库。
我的build议是从默认的开始,当(如果)你碰到不能用它做的事情时改变实现。
这些注册有什么区别?
- 瞬时 – 每次请求时实例化
- 作用域 – 每个请求实例化一次,并在请求的生存期内可用
- 单例 – 实例化一次,并可用于整个应用程序的整个生命周期
- 实例 – 相当于单例,除了提供对象实例而不是创build实例的框架
资料来源: http : //www.khalidabuhakmeh.com/asp-vnext-dependency-injection-lifecycles,http : //dotnetliberty.com/index.php/2015/10/15/asp-net-5-mvc6-dependency-喷射式-6-步骤/
为了回答你的第一个问题:似乎ASP.NET文档已经更新,现在清楚地说明了每种types的注册:
可以使用以下生命周期来configurationASP.NET服务:
短暂的
每次请求时都会创build瞬态生命周期服务。 这个生命周期最适合轻量级的无状态服务。
作用域
作用域生命期服务每个请求创build一次。
独生子
单例生命期服务在第一次请求时被创build,然后每个后续请求将使用相同的实例。 如果您的应用程序需要单例行为,则build议允许服务容器pipe理服务的生命周期,而不是实现单例devise模式,并自己pipe理对象的类生命周期。
实例 [仅限RTM前!]
您可以select直接将实例添加到服务容器。 如果你这样做,这个实例将被用于所有后续的请求(这种技术将创build一个单一范围的实例)。 实例服务和Singleton服务之间的一个主要区别是实例服务在ConfigureServices中创build,而Singleton服务在第一次请求时被延迟加载。
在RTM中更新
请注意,在Asp.Net Core RTM文档实例已被删除。 实例与Singleton基本上是一样的,但是它们有不同的初始化语义(Singleton被延迟加载)。 但是现在没有AddInstance API,只有AddSignleton可以使用已经创build的实例。