C# ASP.NET核心5-如何具有可选依赖项?
我正在开发一个中间件,我希望它对内部日志库有一个可选的依赖关系。换句话说,如果注册了C# ASP.NET核心5-如何具有可选依赖项?,c#,.net,dependency-injection,asp.net-core-middleware,C#,.net,Dependency Injection,Asp.net Core Middleware,我正在开发一个中间件,我希望它对内部日志库有一个可选的依赖关系。换句话说,如果注册了MyLoggingService,那太好了!,否则,生活将继续,我将登录控制台 但是通过声明公共异步任务调用(HttpContext HttpContext,MyLoggingService logger),我得到了一个运行时错误,说它没有注册。我尝试将默认值设置为null,但没有成功。另外,由于它是一个中间件,我不能重载Invoke方法 除了请求服务集合和自己解决依赖关系之外,还有其他解决方案吗?不要选择依赖关
MyLoggingService
,那太好了!,否则,生活将继续,我将登录控制台
但是通过声明公共异步任务调用(HttpContext HttpContext,MyLoggingService logger)
,我得到了一个运行时错误,说它没有注册。我尝试将默认值设置为null
,但没有成功。另外,由于它是一个中间件,我不能重载Invoke
方法
除了请求服务集合和自己解决依赖关系之外,还有其他解决方案吗?不要选择依赖关系,而是考虑:
- 编程到抽象,例如
IMyLoggingService
- 注册实现
公共类CustomMiddleware1:IMIDlWare
{
私有只读IMyLoggingService记录器;
publiccustomidleware1(IMyLoggingService logger)=>this.logger=logger;
公共异步任务InvokeAsync(HttpContext上下文,RequestDelegate next)
{
this.logger.Log(“之前”);
等待下一个(上下文);
this.logger.Log(“之后”);
}
}
空对象实现:
公共密封类NullMyLoggingService:IMyLoggingService
{
公共无效日志(日志条目e){}
}
注册:
services.AddSingleton(新的NullMyLoggingService());
app.Use();
调用AddSingleton(new NullMyLoggingService())
可确保IMyLoggingService
的注册始终存在。这防止了使用者的复杂性,否则,使用者将不得不为记录器不存在的情况添加条件逻辑
只需在第一个IMyLoggingService
之后添加第二个IMyLoggingService即可替换此空实现:
services.addScope();
app.Use();
你可能真的发现了@Crowcoder的一个用例,我以前读过,但我一点都不记得了。我不知道它将如何解决我的服务运行时异常未注册,虽然。。。