问题描述
publicvirtualTUpdate(Tentity,MyDbContextdbExternal=null){ boolisUseExternal=false; MyDbContextdb=null; if(dbExternal==null) { db=newMyDbContext(); }else { db=dbExternal; isUseExternal=true; } try{ //usedb }finally { if(!isUseExternal)db.Dispose(); }}解释一下意图,该方法允许传入一个外部的dbcontext对象,如果有传入那么用外部的dbcontext否则就new一个,最后如果是方法内部自己new的dbcontext那么需要调用dispose,否则不许调用能改进吗?感觉这样写太麻烦
解决方案
解决方案二:
boolisUseExternal=false; MyDbContextdb=null; if(dbExternal==null) { db=newMyDbContext(); }else { db=dbExternal; isUseExternal=true; }
这段可以封装成一个方法,isUseExternal可以用ref来返回结果,相信你有Update,就会有Insert,Delete
解决方案三:
改成必须外部传啊,你直接publicstaticTUpdate(thisMyDbContextdbExternal,Tentity)定义一个MyDbContext的扩展方法不是更好吗?
解决方案四:
publicvirtualTUpdate(Tentity,MyDbContextdbExternal=null){boolisUseExternal=false;MyDbContextdb=dbExternal;if(db==null){isUseExternal=true;db=newMyDbContext();}try{//usedb}finally{if(!isUseExternal)db.Dispose();}}
少了一个else
解决方案五:
引用1楼starfd的回复:
boolisUseExternal=false; MyDbContextdb=null; if(dbExternal==null) { db=newMyDbContext(); }else { db=dbExternal; isUseExternal=true; }这段可以封装成一个方法,isUseExternal可以用ref来返回结果,相信你有Update,就会有Insert,Delete
怎么封装?能举个例吗?
解决方案六:
privateMyDbContextGetContext(MyDbContextdbExternal,outboolisUseExternal){isUseExternal=false;MyDbContextdb=null; if(dbExternal==null) { db=newMyDbContext(); }else { db=dbExternal; isUseExternal=true; }}publicvirtualTUpdate(Tentity,MyDbContextdbExternal=null){ boolisUseExternal; MyDbContextdb=GetContext(dbExternal,outisUseExternal); try{ //usedb }finally { if(!isUseExternal)db.Dispose(); }}
解决方案七:
privateMyDbContextGetContext(MyDbContextdbExternal,outboolisUseExternal){isUseExternal=false;MyDbContextdb=null; if(dbExternal==null) { db=newMyDbContext(); }else { db=dbExternal; isUseExternal=true; }returndb;}publicvirtualTUpdate(Tentity,MyDbContextdbExternal=null){ boolisUseExternal; MyDbContextdb=GetContext(dbExternal,outisUseExternal); try{ //usedb }finally { if(!isUseExternal)db.Dispose(); }}
return没了……
解决方案八:
引用2楼qldsrx的回复:
改成必须外部传啊,你直接publicstaticTUpdate(thisMyDbContextdbExternal,Tentity)定义一个MyDbContext的扩展方法不是更好吗?
派生类会重定这个方法,然后可能加入事务,所以默认情况下是不需要传入这个db对象的,派生类中需要事务处理的时候就会传入这个db
解决方案九:
引用6楼starfd的回复:
privateMyDbContextGetContext(MyDbContextdbExternal,outboolisUseExternal){isUseExternal=false;MyDbContextdb=null; if(dbExternal==null) { db=newMyDbContext(); }else { db=dbExternal; isUseExternal=true; }returndb;}publicvirtualTUpdate(Tentity,MyDbContextdbExternal=null){ boolisUseExternal; MyDbContextdb=GetContext(dbExternal,outisUseExternal); try{ //usedb }finally { if(!isUseExternal)db.Dispose(); }}return没了……
感觉上好一点,
解决方案十:
有没有办法用上using(){}啊
解决方案十一:
MyDbContextdb=dbExternal=null?newMyDbContext():dbExternal;try{}finally{if(dbExternal==null)db.Dispose();}
解决方案十二:
引用9楼u010891254的回复:
有没有办法用上using(){}啊
如果MyDbContext实现IDisposable接口,可以使用usingusing(MyDbContextdb=dbExternal=null?newMyDbContext():dbExternal){//}
但是这样的话,dbExternal不为null的时候,也会Dispose。
解决方案十三:
没人纠正语法吗?isUseExternal--isUsingExternal
解决方案十四:
设计方面,应该能改进吧,一个是传进来一个MyDbContext进行操作,一个是使用内部的MyDbContext进行操作,这个完全可以封装成2个方法吧publicvirtualTWrapUpdate(Tentity,MyDbContextdbExternal){ if(dbExternal==null) { Update(entity); }else { entity(entity,dbExternal); }}publicvirtualTUpdate(Tentity,MyDbContextdbExternal){Debug.Assert(dbExternal!=null,"不允许null");...}publicvirtualTUpdate(Tentity){using(MyDbContextdb=newMyDbContext()){this.Update(...);}...}
解决方案十五:
publicvirtualTUpdate(Tentity,MyDbContextdbExternal=null){vardb=dbExternal??newMyDbContext; try{ //usedb }finally { if(dbExternal==null)db.Dispose(); }}改成这样先用着了,以后再考虑用aop重构了
解决方案:
引用12楼xge的回复:
没人纠正语法吗?isUseExternal--isUsingExternal
好吧,你赢的