首页 > 解决方案 > 如何在 ASP.NET Core 内置 DI 容器中覆盖和接口并调用“基本”接口?

问题描述

假设我有一个由 3pty 库注册到默认容器的接口

// 3pty lib
public interface IFoo {
  SayHello();
  SayBye();
}

internal sealed class FooInternal : IFoo { ... }

public static WithFoo(this IServiceCollection serviceCollection) { 
  serviceCollection.AddScoped<IFoo, FooInternal>();
}

我确实想覆盖该SayBye()方法。我创建了一个类

class FooProxy : IFoo {
   private readonly IFoo baseFoo;
   public FooProxy(IFoo baseFoo) {
     this.baseFoo = baseFoo;
   }

   public void SayHello() { baseFoo.SayHello(); }
   public void SayBye() { ... }
}

现在我面临的问题是如何将它连接到依赖注入。我试过了:

// leads to infinite recursion death
services.AddScoped<IFoo>((sp) => new FooProxy(sp.GetRequiredService<IFoo>()));

并且:

public class FooProxy : IFoo {
  private readonly Func<IFoo> baseFoo;
  SayHello() { baseFoo().SayHello(); }
}

// leads to object disposed error 
services.AddScoped<IFoo>((sp) => new FooProxy(() => sp.GetRequiredService<IFoo>()));

标签: c#asp.net-core.net-coredependency-injection

解决方案


这是您可以使用装饰器模式实现的目标。

为此,有一个图书馆。

  • https://github.com/khillang/Scutor

    service.AddScoped<IFoo,FooConcrete>(); // This I believe register by Third Party
    
    service.Decorate<IFoo,FooProxy>(); // This is you will add.
    
  • 另一种不太好的方法。

    public interface IFooProxy: IFoo
    {
    
    }
    
    public class FooProxy : IFooProxy
    {
            public FooProxy(IFoo foo)
          {
          }
    }
    
      // Configure Sevices
      services.AddScoped<IFooProxy,FooProxy>();
    

推荐阅读