比如我在业务层有一个类:
 public class Global
    {
        public static string UserID="";
       public static string UserName="";
    }然后我在数据访问层想获取当前登录的用户名,该怎么操作??下层理论上是不能访问上层数据的,我在数据访问层一引用业务层,就提示"将导致循环依赖项",这种情况下该怎么样解决??

解决方案 »

  1.   

    假设:有a,b,c三层b继承a,c继承b如果想a获得b中的方法或属性值我一般的做法是通过c来引用a,传从b取得的值,这样a也就有了b的值了
      

  2.   

    这好像不是类的概念,是对象的概念吧,如果不想传参数,那登录后帐号口令保存在一个地方,比如session里,在底层读取这个就行了
      

  3.   

    数据访问层需要使用到当前用户的信息,这在权限判断等方面都是很常见的。
    而用户信息需要在业务层提供,数据访问层不能依赖业务层。可以这样解决,在数据访问层定义一个接口
    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配置的话也都一样。
      

  4.   

    感谢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; 
      } 

    这段代码应该写在数据访问层吗??
      

  5.   


    agentianle所说的可以参考,但我的情况和“依赖倒置”原则(DIP)似乎还不一样,DIP原则解决的是高层不要依赖于低层,而我的问题则是低层要访问上层的数据,当然,为了代码的可重用性,应用接口是正解。如同danjiewu 所提供的代码,其实也包含了DIP的思想
      

  6.   


    关于User类的定义,这个看你自己的需要了。如果仅仅是获取用户名,那么返回string也可以,总之就是需要什么返回什么。
    如果是权限判断,而User需要定义在业务层,那也可以定义一个接口,定义数据访问层需要得到的用户信息。ICurrentUserProvider在数据访问层定义,而在业务层或者更上层实现。数据访问层当然不会关心HttpContext这种东东的,对吧?