比如我在业务层有一个类:
public class Global
{
public static string UserID="";
public static string UserName="";
}然后我在数据访问层想获取当前登录的用户名,该怎么操作??下层理论上是不能访问上层数据的,我在数据访问层一引用业务层,就提示"将导致循环依赖项",这种情况下该怎么样解决??
public class Global
{
public static string UserID="";
public static string UserName="";
}然后我在数据访问层想获取当前登录的用户名,该怎么操作??下层理论上是不能访问上层数据的,我在数据访问层一引用业务层,就提示"将导致循环依赖项",这种情况下该怎么样解决??
解决方案 »
- 急,急,急,怎么设置excel格式????
- 请问高手:能否创建一个返回记录集的DLL?
- .NET中如何实现客户端数据加密
- web下的程序设计有没有好的日期控件呀?C#本身提供的calender不是我需要的!谢谢...
- 急!急!急!基于WINCE的SOCKET报10054
- 请问下iTextSharp 有没有预览,打印PDF的方法,用过的请进来告知下
- DataTable数据对比问题!
- C#做视频原理。
- 在C#中如何实现象office中插入对象的功能?
- 请问如何才能使用户点击了右上面的"关闭"按钮后,使应用程序不退出.
- Update 无法找到 TableMapping['country'] 或 DataTable“country”。
- 常量值“65306”无法转换为“char”
而用户信息需要在业务层提供,数据访问层不能依赖业务层。可以这样解决,在数据访问层定义一个接口
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配置的话也都一样。
{
User GetCurrentUser();
}
这里User应该在哪里定义?一般情况下,User肯定是在业务层定义,那么这里同样无法获取到User的定义!除非我直接定义成string就不会有问题了。还有ICurrentUserProvider的实现,
public class HttpCurrentUserProvider : ICurrentUserProvider{
public User GetCurrentUser(){
return HttpContext.Current.Session["CurrentUser"] as User;
}
}
这段代码应该写在数据访问层吗??
agentianle所说的可以参考,但我的情况和“依赖倒置”原则(DIP)似乎还不一样,DIP原则解决的是高层不要依赖于低层,而我的问题则是低层要访问上层的数据,当然,为了代码的可重用性,应用接口是正解。如同danjiewu 所提供的代码,其实也包含了DIP的思想
关于User类的定义,这个看你自己的需要了。如果仅仅是获取用户名,那么返回string也可以,总之就是需要什么返回什么。
如果是权限判断,而User需要定义在业务层,那也可以定义一个接口,定义数据访问层需要得到的用户信息。ICurrentUserProvider在数据访问层定义,而在业务层或者更上层实现。数据访问层当然不会关心HttpContext这种东东的,对吧?