三层结构中,下层如何访问上层数据??

lanman 2009-02-27 08:40:13
比如我在业务层有一个类:
public class Global
{
public static string UserID="";
  public static string UserName="";
}

然后我在数据访问层想获取当前登录的用户名,该怎么操作??下层理论上是不能访问上层数据的,我在数据访问层一引用业务层,就提示"将导致循环依赖项",这种情况下该怎么样解决??
...全文
428 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
danjiewu 2009-03-02
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 lanman 的回复:]
感谢danjiewu ,这种方法应该是比较完美的解决了我的问题,不过你的代码同样有一个问题,public interface ICurrentUserProvider
{
User GetCurrentUser();
}
这里User应该在哪里定义?一般情况下,User肯定是在业务层定义,那么这里同样无法获取到User的定义!除非我直接定义成string就不会有问题了。

还有ICurrentUserProvider的实现,
public class HttpCurrentUserProvider : ICurrentUserProvider{
p…
[/Quote]

关于User类的定义,这个看你自己的需要了。如果仅仅是获取用户名,那么返回string也可以,总之就是需要什么返回什么。
如果是权限判断,而User需要定义在业务层,那也可以定义一个接口,定义数据访问层需要得到的用户信息。

ICurrentUserProvider在数据访问层定义,而在业务层或者更上层实现。数据访问层当然不会关心HttpContext这种东东的,对吧?
lanman 2009-03-01
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 agentianle 的回复:]
请参考OO设计思想的 “依赖倒置”原则,可以解决你的问题
[/Quote]

agentianle所说的可以参考,但我的情况和“依赖倒置”原则(DIP)似乎还不一样,DIP原则解决的是高层不要依赖于低层,而我的问题则是低层要访问上层的数据,当然,为了代码的可重用性,应用接口是正解。如同danjiewu 所提供的代码,其实也包含了DIP的思想
lanman 2009-03-01
  • 打赏
  • 举报
回复
还有 散分不眨眼大魔头 ,如果用委托该怎么操作,我也想过用委托,但因为无法获到到上层类的类型,所以感觉委托也没有办法!!
lanman 2009-03-01
  • 打赏
  • 举报
回复
感谢danjiewu ,这种方法应该是比较完美的解决了我的问题,不过你的代码同样有一个问题,public interface ICurrentUserProvider
{
User GetCurrentUser();
}
这里User应该在哪里定义?一般情况下,User肯定是在业务层定义,那么这里同样无法获取到User的定义!除非我直接定义成string就不会有问题了。

还有ICurrentUserProvider的实现,
public class HttpCurrentUserProvider : ICurrentUserProvider{
public User GetCurrentUser(){
return HttpContext.Current.Session["CurrentUser"] as User;
}
}
这段代码应该写在数据访问层吗??
jeremychin 2009-02-27
  • 打赏
  • 举报
回复
接口
pbmlly 2009-02-27
  • 打赏
  • 举报
回复
可以把取用户的方法写在中间层啊.
steal8275756 2009-02-27
  • 打赏
  • 举报
回复
实在不想大改代码的话 那就只能再额外定义一层了。
wojiaochenglong 2009-02-27
  • 打赏
  • 举报
回复
有点乱
danjiewu 2009-02-27
  • 打赏
  • 举报
回复
数据访问层需要使用到当前用户的信息,这在权限判断等方面都是很常见的。
而用户信息需要在业务层提供,数据访问层不能依赖业务层。

可以这样解决,在数据访问层定义一个接口
public interface ICurrentUserProvider
{
User GetCurrentUser();
}

然后定义一个static变量:
public static class CurrentUserProvider{
public static ICurrentUserProvider Provider;
}

ICurrentUserProvider在不同的架构中实现是不同的,比如在Web程序中可以通过session来获得用户信息:
public class HttpCurrentUserProvider : ICurrentUserProvider{
public User GetCurrentUser(){
return HttpContext.Current.Session["CurrentUser"] as User;
}
}
然后在global.asax的Application_Start里设置
CurrentUserProvider.Provider = new HttpCurrentUserProvider();
使用static变量只是为了简化问题,如果用工厂模式或者使用Spring配置的话也都一样。
tmd456 2009-02-27
  • 打赏
  • 举报
回复
这是什么类的应用
天乐 2009-02-27
  • 打赏
  • 举报
回复
请参考OO设计思想的 “依赖倒置”原则,可以解决你的问题
wangzhe1945 2009-02-27
  • 打赏
  • 举报
回复
非要这么做,用委托吧
wangzhe1945 2009-02-27
  • 打赏
  • 举报
回复
下层为什么要调用上层,数据访问层只要做好自己的份内之事就行了,还要管当前用户名?
hztltgg 2009-02-27
  • 打赏
  • 举报
回复
这好像不是类的概念,是对象的概念吧,如果不想传参数,那登录后帐号口令保存在一个地方,比如session里,在底层读取这个就行了
Lovest 2009-02-27
  • 打赏
  • 举报
回复
这样导致两个类之间互相引用,还是改了吧
wonture 2009-02-27
  • 打赏
  • 举报
回复
按道理来说,应该是业务逻辑层调用数据访问层(相信你现在也是这样),你还想在数据访问层调用业务逻辑层的东西?这算什么逻辑?要改代码就改呗,改成传参。
lanman 2009-02-27
  • 打赏
  • 举报
回复
现在问题关键就在于我不想直接在层调用时传值,那样程序改动太大了。有没有什么办法能直接访问到其中的数据,因为也就是获取一用户名,其它的数据都不需要。
不知道反射能不能实现!!?
maxiho 2009-02-27
  • 打赏
  • 举报
回复
mark
jinsuo_1986 2009-02-27
  • 打赏
  • 举报
回复
中间插入一层:proxy
lgqiu2008 2009-02-27
  • 打赏
  • 举报
回复
mark
加载更多回复(2)

110,535

社区成员

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

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

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