公共方法提取或者更好的办法

csdnFUCKINGSUCKS 2014-12-02 03:34:18
代码片段的作用是:根据班级编号更新班级名称,包含并发处理。
现在的问题是:
每一个Update操作都重新写一遍相同的并发验证,这是不可能也不合理的。

所以想把并发处理这一块提取出来。
同样的,还有事务的处理也是一样。

听到的声音:在方法前加一个Attribute 如[CauseConflict] 当加了这个Attribute的时候 执行这个方法就会捕捉并发异常

然后我看了下Attribute的用法,似乎不太适合用于这样的场景。
So
各位大神有没有方法来实现Attribute这样的形式,或者有更好的办法。




public string UpdateClass(Guid id, string name)
{
using (SampleDataContext context = new SampleDataContext())
{
try
{
var p = context.Classes.SingleOrDefault(c => c.id == id);
p.name = name;
context.SubmitChanges();
return "Success";
}
catch (ChangeConflictException)
{
foreach (ObjectChangeConflict cc in context.ChangeConflicts)
{
ClassEntity c = (ClassEntity)cc.Object;
//放弃当前更新,所有更新以原先更新为准
cc.Resolve(RefreshMode.OverwriteCurrentValues);
}
return "This record has been changed by other user";
}
catch (Exception ex)
{
return ex.Message;
}
}
}
...全文
208 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
winnowc 2014-12-02
  • 打赏
  • 举报
回复
这种需求属于AOP,适合使用动态代理,在代理里面处理异常,原本的方法就不用处理了。这样调用的时候最方便。你这个异常里还需要使用context,稍微麻烦点,要把context的构造和销毁放外面去。动态代理工具比如DynamicProxy,也有很多IoC框架也支持生成动态代理。 这个自己写的话最简单的写法就是用一个方法来包装调用,但是就是调用的时候麻烦点。比如:

// 调用的时候
H(ctx => UpdateClass(ctx, id, name));

// 原始方法只包含业务
public void UpdateClass(SampleDataContext context, Guid id, string name)
{
    var p = context.Classes.SingleOrDefault(c => c.id == id);
    p.name = name;
    context.SubmitChanges();
}

// 处理异常的逻辑
public string H(Action<Context> action)
{
    using (var context = new SampleDataContext())
    {
        try
        {
            action(context);
            return "Success";
        }
        catch (ChangeConflictException)
        {
            foreach (ObjectChangeConflict cc in context.ChangeConflicts)
            {
                ClassEntity c = (ClassEntity)cc.Object;
                cc.Resolve(RefreshMode.OverwriteCurrentValues);
            }
            return "This record has been changed by other user";
        }
        catch (Exception ex)
        {
            return ex.Message;
        }
    }
}
这是最简单的封装,当然也能写的更复杂,支持更多的场景,比如像mvc或者WebApi框架里的Filter那种形式。不过自己写还是很费劲的,不如直接用工具生成代理。
stormem 2014-12-02
  • 打赏
  • 举报
回复
每次 需要 try{}catch{} 的时候 通过委托把你的方法传进去就行。
於黾 2014-12-02
  • 打赏
  • 举报
回复
新建一个类, public static class 然后新建个方法 public static function() 然后各种地方都调用这个方法就好了
stormem 2014-12-02
  • 打赏
  • 举报
回复
写一个委托去处理。
csdnFUCKINGSUCKS 2014-12-02
  • 打赏
  • 举报
回复
引用 1 楼 Z65443344 的回复:
我需要先知道你这个并发操作,是进程里使用了多线程操作表,还是多客户端同时连接数据库操作表? 如果是多线程,可以加互斥锁,保证每次只有一个线程去操作数据库 如果是多进程,需要加事务锁
我的问题并不是要怎么处理这个并发。 简单的说,就是怎么把try{}catch{}块提取成公共方法,每当我更新表数据时,同时调用这个方法,就能处理并发问题了,不用我每次更新都要写一遍try{}catch{}
於黾 2014-12-02
  • 打赏
  • 举报
回复
我需要先知道你这个并发操作,是进程里使用了多线程操作表,还是多客户端同时连接数据库操作表? 如果是多线程,可以加互斥锁,保证每次只有一个线程去操作数据库 如果是多进程,需要加事务锁

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧