我们有一个项目使用Interceptor对象告诉NHibernate在保存实体之前做一些一般的工作。这个拦截器有一个任务要做。现在还有另一个任务应该添加到这个拦截器(NHibernate没有支持多个拦截器)但我不想让这个拦截器变得复杂而我想使用组合模式来管理所有已注册的拦截器。这样的事情:
public bool Onload(object entity,object id,object[] state,string propertyNames,IType[] types_
{
var result=false;
foreach(var interceptor in _registeredInterceptors)
result=result || interceptor.OnLoad(entity,id,state,propertyNames,types);
return result;
}
public bool OnFlushDirty(object entity,object id,object[] state,string propertyNames,IType[] types_
{
var result=false;
foreach(var interceptor in _registeredInterceptors)
result=result || interceptor.OnFlushDirty(entity,id,state,propertyNames,types);
return result;
}
通过查看此代码,我意识到可能有更好的方法阻止我重复自己。
问题是我可以使用Lambda表达式和yield关键字使这段代码更简单和抽象吗?
答案 0 :(得分:2)
这样做的一种方式可能如下:
public bool Execute(IList<IInterceptor> interceptors, Func<IInterceptor, bool> func)
{
bool result = false;
foreach (IInterceptor interceptor in interceptors)
{
result = result || func(interceptor);
}
return result;
}
在父拦截器中:
public bool Onload(object entity, object id, object[] state, string propertyNames, IType[] types_
{
return Execute(_registeredInterceptors, x => x.OnLoad(entity, id, state, propertyNames, types);
}
public bool OnFlushDirty(object entity, object id, object[] state, string propertyNames, IType[] types_
{
return Execute(_registeredInterceptors, x => x.OnFlushDirty(entity, id, state, propertyNames, types);
}
<强>更新强>
如果您希望结果类型是通用的,可以这样做:
public static T Execute<T>(IList<IInterceptor> interceptors, Func<IInterceptor, T> func)
{
T result = default(T);
foreach (IInterceptor interceptor in interceptors)
{
// your logic based on type T
}
return T;
}
由于bool
,通用版本的执行与Type inference
版本完全相同。
这是你的想法吗?