代码之家  ›  专栏  ›  技术社区  ›  BuddyJoe

Caliburn.Micro和webservicesult

  •  0
  • BuddyJoe  · 技术社区  · 14 年前

    我正在为Caliburn.Micro寻找这个类的正确版本

    公共类webservicesult:IResult,其中T:new()

    它不会直接剪切粘贴到微型项目中。缺少的类太多,无法直接使用它。思想?或者有人知道替代品?

    1 回复  |  直到 14 年前
        1
  •  2
  •   Marco Amendola    14 年前

    Event尽管Caliburn Micro的底层基础设施非常不同(它基于System.Windows.interactive),但概念几乎是相同的。

    public class WebServiceResult<T, K> : IResult
        where T : new()
        where K : EventArgs
    {
    
        readonly static Func<bool> ALWAYS_FALSE_GUARD= () => false;
        readonly static Func<bool> ALWAYS_TRUE_GUARD = () => true;
    
        private readonly Action<K> _callback;
        private readonly Expression<Action<T>> _serviceCall;
    
        private ActionExecutionContext _currentContext;
        private Func<bool> _originalGuard;
    
    
    
    
        public WebServiceResult(Expression<Action<T>> serviceCall)
        { 
            _serviceCall = serviceCall;
        }
    
        public WebServiceResult(Expression<Action<T>> serviceCall, Action<K> callback)
        {
            _serviceCall = serviceCall;
            _callback = callback;
        }
    
        public event EventHandler<ResultCompletionEventArgs> Completed = delegate { };
    
        public void Execute(ActionExecutionContext context)
        {
            _currentContext = context;
    
            //if you would to disable the control that caused the service to be called, you could do this:
            ChangeAvailability(false);
    
            var lambda = (LambdaExpression)_serviceCall;
            var methodCall = (MethodCallExpression)lambda.Body;
            var eventName = methodCall.Method.Name.Replace("Async", "Completed");
            var eventInfo = typeof(T).GetEvent(eventName);
    
            var service = new T();
    
            eventInfo.AddEventHandler(service, new EventHandler<K>(OnEvent));
    
            _serviceCall.Compile()(service);
        }
    
        public void OnEvent(object sender, K args)
        {
            //re-enable the control that caused the service to be called:
            ChangeAvailability(true);
    
            if (_callback != null)
                _callback(args);
    
            Completed(this, new ResultCompletionEventArgs());
        }
    
    
    
        private void ChangeAvailability(bool isAvailable)
        {
            if (_currentContext == null) return;
    
            if (!isAvailable) {
                _originalGuard = _currentContext.CanExecute;
                _currentContext.CanExecute = ALWAYS_FALSE_GUARD;
            }
            else if (_currentContext.CanExecute == ALWAYS_FALSE_GUARD) {
    
                _currentContext.CanExecute = _originalGuard ?? ALWAYS_TRUE_GUARD;
            }
    
    
            _currentContext.Message.UpdateAvailability();
    
        }
    
    
    }