【发布时间】:2020-08-06 17:03:40
【问题描述】:
我有一个方法,每当发生事情时都会调用它。它可以被调用任意次数。然后方法返回一个任务。基本上,我想在调用此方法时设置一个“可观察的”。我无法控制被调用的方法。被调用的方法是虚拟的,所以我可以覆盖它以查看它是否被调用。但我宁愿设置一个“可观察的”。所以我有类似的东西
class Foo
{
void Bar()
}
同样,我无法控制 Foo,但我有它的一个实例。
var instanceofFoo = new Foo();
我想设置一个“可观察”,只要调用 instanceOfFoo.Bar 就会触发。
我想要一个“可观察”的原因是因为我不想为可能的下一次调用再次设置“观察者”。我正在使用 C# 进行编码,我查看了 IObservable<T> 和 IObserver<T>,但它明确指出“提供者”必须实现 IObservable<T>。由于我无法控制提供者(在本例中为 Foo 的实例),因此我无法使用它。我查看了 Rx.NET,但无法从示例中收集到适合这种情况的东西。更复杂的是,假设 Foo 的实例是另一个类的依赖项,例如
class FooService
{
public bool wasCalled { get; set; }
public FooService(Foo f)
{
// TODO: Setup code to trigger when f.Bar() is called
}
}
此设置需要能够彻底拆除,以便没有悬空的“订阅者”。
所以流程应该是这样的
- var foo = new Foo();
- var fooService = new FooService(foo);
- foo.Bar();
- Assert.IsTrue(fooService.wasCalled);
想法?
【问题讨论】:
-
您一直在引号中使用“可观察”一词,就好像您的意思是要赋予您将要解释的某些含义——但是您却永远没有时间解释它。所以我想知道你的意思,具体来说。你能努力找到正确的术语吗?或者不使用未定义的新词,用简单的术语解释?我猜你想要某种
event或者你想要在调用Foo之前或之后执行代码。 -
如果您可以覆盖该方法,那么一种选择可能是覆盖该方法,调用基本方法,然后触发您的通知事件。
-
您可能正在寻找“拦截” - 如果您将 Unity 用于 DI 并且您尝试查看的方法是某个接口(或至少是虚拟接口)的一部分,那么它应该是可行的。如果你无法控制
Foo的创建,我猜你会寻找某种程序集重写。 -
将其包装在您自己控制的类型中,并且只能通过您的类型访问它。
-
@JohnWu 我说“可观察”就像 RXjs 定义可观察对象的方式一样。据我所知,C# 没有等效的概念。我不想要一个用于测试目的的事件。为了测试,我想模拟依赖关系,所以当我对 Bar() 进行模拟调用时,我可以观察 FooService 中的后果。
标签: c# observable