依懒注入
依懒
当一个类需要另一个类协作来完成工作的时候就产生了依赖。比如我们在AccountController这个控制器需要完成和用户相关的注册、登录 等事情。其中的登录我们由EF结合Idnetity来完成,所以我们封装了一个EFLoginService。这里AccountController就有一个ILoginService的依赖。
这里有一个设计原则:依赖于抽象,而不是具体的实现。所以我们给EFLoginService定义了一个接口,抽象了LoginService的行为。
注入
注入体现的是一个IOC(控制反转的的思想)
控制反转
为了在业务变化的时候尽少改动代码可能造成的问题。
比如我们现在要把从EF中去验证登录改为从Redis去读,于是我们加了一个 RedisLoginService。这个时候我们只需要在原来注入的地方改一下就可以了。
NetCore依懒注入
- Transient: 每一次GetService都会创建一个新的实例
- Scoped: 在同一个Scope内只初始化一个实例 ,可以理解为( 每一个request级别只创建一个实例,同一个http request会在一个 scope内)
- Singleton :整个应用程序生命周期以内只创建一个实例
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<ILogsBLL, LogsBLL>();
services.AddServices();
ServiceCommon.ServiceProvider = services.BuildServiceProvider();
services.AddMvc();
}
[Route("api/[controller]")] public class ValuesController : Controller { private ILogsBLL _log; public ValuesController(ILogsBLL log) { _log = log; }