这段代码可以改进吗?

问题描述

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

好吧,你赢的

时间: 2024-08-01 20:16:37

这段代码可以改进吗?的相关文章

c-请大家看看这段代码怎么改进(我想养成好的编程习惯)。谢谢。

问题描述 请大家看看这段代码怎么改进(我想养成好的编程习惯).谢谢. 题目见图片. 下面是代码(这道题当然还有其他解法,我这里是刻意用链表做的) { #include #include typedef struct monkey{ int num; struct monkey * next; } M; void game(int, int, int); M create_list(M *,int ); int main(void) { int n; scanf("%d", &n

regex-C#关与正则匹配链接的问是,这段代码怎么修改?

问题描述 C#关与正则匹配链接的问是,这段代码怎么修改? substrUrl 是链接的值,一般情况是能匹配,但是像这样 链接里带了很多空格的,就匹配不出来了,求高手看下这个正则怎么改进使带空格时也能取出 代码如下: Regex reg = new Regex(@""(?is)<a[^>]*?href=(['""""]?)(?<url>[^'""""s>]+)1[^>]*&

c++-这段代码怎么改,才能运行(main的第一行要保留)

问题描述 这段代码怎么改,才能运行(main的第一行要保留) #include using namespace std; class student { public: student(int n,float s):num(n),score(s){} void change(int n,float s){num=n;score=s;} void display(){cout<<num<<" "<<score<<endl;} private

孙鑫-Visual C++的一段代码搞不懂求解释

问题描述 Visual C++的一段代码搞不懂求解释 说一下自己的理解.题目是孙鑫老是的文本输出的例子. 1:GetBkColor得到背景白色,然后SetTextColor(白色)把背景白色设置为文字颜色.跟着clr应该是赋值得到白色了吧,但是F5看的时候是黑色,就要原文字颜色.我这么理解应该错了 1 COLORREF clr=dc.SetTextColor(dc.GetBkColor()); //GetBkColor属于dc对象,改变dc中的背景值(白色).然后SetTextColor用白色值

android-贴一段代码,关于自动接听的,请老司机帮帮忙

问题描述 贴一段代码,关于自动接听的,请老司机帮帮忙 public synchronized void answerRingingCall(Context context) { try { Log.e("try to answer", "below 2.3"); //ITelephony itelephony = getITelephony(mTelephonyManager); Method method = Class.forName("android

编译错误-出现了fatal exception :main 这是其中的一段代码,大家看看有什么问题

问题描述 出现了fatal exception :main 这是其中的一段代码,大家看看有什么问题 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); loginBtn = (Button)findViewById(R.id.login_btn_login); registerBtn = (Butt

求助servlet 这段代码什么意思

问题描述 求助servlet 这段代码什么意思 */ @RequestMapping("/getTile.do") public @ResponseBody String getTile(HttpServletResponse response, @RequestParam(value = "map_id", required = true) String mapId, @RequestParam(required = true) int level, @Reque

ancy orm-用FancyForm添加用户角色,求解释这段代码,

问题描述 用FancyForm添加用户角色,求解释这段代码, var form = $('#form').FancyForm({ title: '添加角色' width: 345 height: 325 inputWidth: 190 labelWidth: 60 url: '<%=path %>/sysRoleController/addRole.do' params: { param1: 1 param2:'string' } defaults: { type: 'string' } it

C++课程设计老师说我没有用到类 求指教这段代码要怎么修改加上类

问题描述 C++课程设计老师说我没有用到类 求指教这段代码要怎么修改加上类 #include #include #include using namespace std; const double pi = 3.14159265; const double e = 2.718281828459; const int SIZE = 1000; typedef struct node//为了处理符号而建立的链表(如: 1+(-2)) { char data; node *next; }node; t