仅修改控制器时,如何避免GetLookupValues方法重复(委托场景)
解决方案:通过Lambda适配委托,合并重载方法
嘿,这个场景我之前也碰到过——核心逻辑完全一样,就因为委托带不带参要写两个几乎重复的方法,确实挺烦的。既然不能动业务逻辑层,咱们可以用Lambda表达式把无参委托适配成带参委托,只保留一份核心方法,彻底解决重复问题。
步骤1:精简核心方法,移除重复重载
先删掉无参版本的GetLookupValues,只保留带参的核心实现——这部分是真正的业务逻辑,只需要维护一份:
// 保留BL层需要的委托定义,控制器只需要用带参的那个做参数 public delegate List<TResult> LookupFunc<TResult>(); public delegate List<TResult> LookupFuncWithParam<TResult>(int id); // 唯一的核心方法,处理所有查询逻辑 private ActionResult GetLookupValues<TResult>(LookupFuncWithParam<TResult> lookupFunc, int id) { var listOfValues = lookupFunc(id); return ClientSideDTORender(listOfValues); }
步骤2:用Lambda包装无参BL方法,适配成带参委托
调用无参的BL方法时,用Lambda表达式忽略传入的id参数,把无参方法“伪装”成带参委托的形式,直接复用核心方法:
public ActionResult GetAllCountries() { // 用(_) => 忽略id参数,直接执行无参的BL方法 return GetLookupValues<Country>((_) => _blLookups.GetAllCountries(), 0); // 这里id传0或者任意int值都可以,因为Lambda里根本不会用到它 } // 带参的调用方式完全保持不变,不需要任何修改 public ActionResult GetAllCities(int CountryId) { return GetLookupValues<City>(_blLookups.GetAllCities, CountryId); }
可选优化:添加轻量适配器方法(保持调用简洁)
如果觉得每次写Lambda有点啰嗦,可以加一个超轻量的适配器方法——注意这不是重复代码,只是做委托类型的转换,核心逻辑还是复用同一个GetLookupValues:
// 仅做委托适配,无任何重复逻辑 private ActionResult GetLookupValues<TResult>(LookupFunc<TResult> lookupFunc) { return GetLookupValues((_) => lookupFunc(), 0); }
这样调用的时候就和原来一样简洁:
public ActionResult GetAllCountries() { return GetLookupValues<Country>(_blLookups.GetAllCountries); }
这个方案的好处很明显:完全不需要改动BL层,核心业务逻辑只维护一份,所有调用都统一到同一个方法入口,完美符合你代码复用的要求。
内容的提问来源于stack exchange,提问作者Omtechguy
相关产品推荐
相关产品推荐

