c# - 如何在 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>()));
解决方案
这是您可以使用装饰器模式实现的目标。
为此,有一个图书馆。
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>();
推荐阅读
- python - 我无法删除出现在 DataFrame 的金额列中的日期
- c - 如何在带有链表的哈希表中修复 C 中的分段错误
- docker - 以交互方式在 Docker 容器中安装软件
- amazon-web-services - 限制访问 URL 的用户数
- bootstrap-4 - React Bootstrap Col Props 代替类
- multithreading - 为什么线程不会增加运行时间超过某个点
- r - 在侧边栏列上插入空格或中断 - Flexdashboard
- r - 如何在 r 中使用固定时间效果?
- r - 有没有办法加载多个 .txt 文件并在之后列出它们以便可以更改编码?
- javascript - 我可以在 Typescript 中使用 io-ts 使用正则表达式测试字符串吗