【问题标题】:return instance with modifying some attributes in C#在 C# 中修改某些属性返回实例
【发布时间】:2016-12-24 03:16:28
【问题描述】:

我想知道 C# 中的一个成语。我写代码相关的远程代理。

public Task SetIndexAsync(int index)
{
    var state = this.StateManager.TryGetStateAsync<ActorState>("MyState").GetAwaiter().GetResult().Value;

    if (state == null)
    {
        state = new ActorState() { Temperature = 0 };
    }
    state.Index = index;
    this.StateManager.SetStateAsync<ActorState>("MyState", state);
    return Task.FromResult(true);
}

这不酷。 :(

我试着这样写。但是,它仍然不酷。

private ActorState StateProxy
{
    get
    {
        return this.StateManager.TryGetStateAsync<ActorState>("MyState").GetAwaiter().GetResult().Value;
    }

    set
    {
        this.StateManager.AddOrUpdateStateAsync<ActorState>("MyState", value, (k, v) => value)
    }
}

public Task SetIndexAsync(int index)
{
    Func<ActorState, int, ActorState> addIndex = (state, idx) => { state.Index = idx; return state; };
    addIndex(StateProxy, index);
    return Task.FromResult(true);
}

如果我可以编写单行代码,通过修改属性返回实例, 可能会更好。或者对此有什么很酷的解决方案的想法?

【问题讨论】:

    标签: c# azure-service-fabric


    【解决方案1】:

    最后,我决定这样走。我记得 ActiveRecord 的设计。

        internal sealed class ActorState
        {
            [DataMember]
            public List<string> PartitionNames { get; set; }
            [DataMember]
            public Dictionary<string, DateTime> PartitionLeases { get; set; }
    
            private IActorStateManager stateManager;
    
            internal static ActorState GetState(IActorStateManager stateManager)
            {                
               var state = stateManager.GetStateAsync<ActorState>("MyState").GetAwaiter().GetResult();
                state.stateManager = stateManager;
                return state;
            }
            internal void Save()
            {
                stateManager.AddOrUpdateStateAsync<ActorState>("MySate", this, (k,v) => this ).GetAwaiter();
            }
        }
    

    用法:

            var stateProxy = ActorState.GetState(this.StateManager);
            List<string> keys = stateProxy.PartitionLeases.Keys.ToList();
            foreach(string key in keys)
            {
                if (DateTime.Now - stateProxy.PartitionLeases[key] >= TimeSpan.FromSeconds(60))
                    stateProxy.PartitionLeases.Remove(key);
    
            }
            stateProxy.Save();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多