Caliburn.Micro 和 WebServiceResult

发布于 2024-09-28 18:41:04 字数 206 浏览 5 评论 0原文

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

public class WebServiceResult : IResult where T : new()

上面的签名来自完整 Caliburn 框架中的 ContactManager 示例。 它不会直接剪切并粘贴到基于 Micro 的项目中。缺少的类太多,无法直接使用它。想法?或者有人知道替代品吗?

I'm looking for the correct version of this class for Caliburn.Micro

public class WebServiceResult : IResult where T : new()

The above signature is from the ContactManager example in the full Caliburn framework.
It does not cut and paste directly into a Micro-based project. There are too many missing classes to use this directly. Thoughts? or anyone know of the replacement?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

回忆躺在深渊里 2024-10-05 18:41:04

虽然 Caliburn Micro(基于 System.Windows.Interactivity)的底层基础设施非常不同,但概念几乎相同。

这是CM版本:

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();

    }


}

Event though the underlying infrastructure is very different in Caliburn Micro (which is based on System.Windows.Interactivity), the concepts are pretty much the same.

Here is the CM version:

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();

    }


}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文