对模拟引擎使用反应式扩展



如何使用反应式扩展构建一个简单的模拟引擎?例如,假设您有一个具有属性 IsPoweredSpeed 的类Motor。您希望通过让Speed从 0 到 1000 RPM 每秒从 10 RPM 增加到 1000 RPM IsPowered从 false 变为 true 做出反应,持续 100 秒。

稍微

抽象一下,假设你想要提供一个可插入的API,其中类及其属性事先是未知的。相反,模拟引擎会获得可观察的属性更改流,该更改通过创建其他属性更改来做出反应,其中许多更改会利用 Rx 随着时间的推移而递增发生。这样的 API 可能是什么样子的?

模拟 API 需要一个表示属性更改的类型,以及一个具有传入和传出更改流IObservable<T>模拟方法。模拟引擎的实现将包括对传入属性更改做出反应以更新输出流的规则。

类型是这样的(尽管结构可能比类更好):

class PropertyChange
{
    public PropertyChange(string name, object value) { Name = name; Value = value; }
    public string Name { get; private set; }
    public object Value { get; private set; }
}

模拟方法如下所示。为了演示多个规则,此代码预先假定一个仅跟踪IsPowered的属性IsLightOn

IObservable<PropertyChange> Simulate(IObservable<PropertyChange> incomingChanges)
{
    var isLightOnRule =
        from c in incomingChanges
        where c.Name == "IsPowered"
        select new PropertyChange("IsLightOn", c.Value);
    var ramp = Observable.Generate(0, speed => (speed <= 1000), speed => speed + 10, speed => new PropertyChange("Speed", speed), _ => TimeSpan.FromSeconds(1));
    var speedRule = incomingChanges
        .Where(c => c.Name == "IsPowered" && (bool)c.Value)
        .SelectMany(ramp);
    // Add more rules here.
    return Observable.Merge(isLightOnRule, speedRule /* merge more rules here */);
}

相关内容

  • 没有找到相关文章

最新更新