如何在ASP.NET 核心内置DI 容器中覆盖和调用"base" 接口?
How to override and interface and call "base" interface in ASP.NET Core built-in DI container?
假设我有一个由 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
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>()));
这是你可以使用装饰器模式实现的。
为此,只有一个库。
https://github.com/khellang/Scrutor
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>();
假设我有一个由 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
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>()));
这是你可以使用装饰器模式实现的。
为此,只有一个库。
https://github.com/khellang/Scrutor
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>();