首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NHibernate IInterceptor合成

NHibernate IInterceptor合成
EN

Stack Overflow用户
提问于 2012-02-03 17:15:44
回答 1查看 372关注 0票数 1

我们有一个项目,它使用拦截器对象来告诉NHibernate在保存entity.This拦截器之前做一些常规工作。do.Now有一个单一的任务,应该添加到这个拦截器中(NHibernate不支持多个拦截器),但是我不想让这个拦截器变得复杂,相反,我想使用组合模式来管理所有注册的interceptors.something:

代码语言:javascript
复制
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关键字让这段代码变得更简单和抽象?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-04 21:55:32

其中一种方法可能如下所示:

代码语言:javascript
复制
public bool Execute(IList<IInterceptor> interceptors, Func<IInterceptor, bool> func)
{
    bool result = false;
    foreach (IInterceptor interceptor in interceptors)
    {
        result = result || func(interceptor);
    }

    return result;
}

在父拦截器中:

代码语言:javascript
复制
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);
}

更新

如果你想让结果类型是泛型的,你可以这样做:

代码语言:javascript
复制
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;
}

由于使用了Type inference,通用版本的执行看起来与bool版本完全相同。

这就是你所想的吗?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9126207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档