2016-08-17 1 views
-1

Я хотел бы знать идиому на C#. Я пишу код, связанный с Remote Proxy.экземпляр возврата с изменением некоторых атрибутов в 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); 
} 

Если бы я мог написать один вкладыш, который возвращает экземпляр с модификацией атрибута, может быть лучше. Или ? какие-либо идеи для холодного раствора для этого

ответ

0

Наконец, я решил пойти, как это я помню дизайн 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();