一、背景介绍
最近在做的Winform项目,请求一个接口,接口中有一个参数是通过执行一段JavaScript获取的,所以,每次调用接口都需要执行一段JavaScript。不是每一次调用接口都会成功,所以需要多次调用直到接口调用成功。
二、普通写法
由于执行JavaScript需要CefSharp,业务层不可能引用CefSharp这个组件,所以循环调用接口就要放在UI层,也只能放在UI层。当多个地方调用这个接口的话,就会有很多冗余的代码。
三、通过Func重构
问题的关键就是如何把执行JavaScript放到业务层,而又不引用CefSharp,所以就需要把方法当做参数传到业务层,在合适的时候调用这个传入的方法。
其实在JavaScript中,传递方法是很简单的,直接传递方法名就行了,在C#里面要用Func或Action封装一下。
执行这个JavaScript需要返回一个字符串,所以方法原型就是Func<string>
public static Func<string> GetSignFunc() { return () => { return CEFBrowser.EvaluateScriptAsync(MainForm.cefWebBrowser, "js...").Result.Result.ParseToString(); }; }
然后业务层的代码
public TData<List<ProductInfo>> GetProductList(Func<string> getSignFunc) { TData<List<ProductInfo>> obj = new TData<List<ProductInfo>>(); try { while (true) { string sign = getSignFunc(); } } catch (Exception ex) { } return obj; }