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的一个用例,我以前读过,但我一点都不记得了。我不知道它将如何解决我的服务运行时异常未注册,虽然。。。