Database 我应该在应用程序级别之间传递UserID吗?
当userID不是要传递的对象中的字段,但在提交数据时仍需要使用userID交叉引用表时,向数据层提交数据时,我应该调用成员类以获取数据层的userID,还是应该将userID作为参数从一个级别传递到另一个级别?(即从业务层到数据层?) (或者这两种方式都不重要?) 控制器或业务层:Database 我应该在应用程序级别之间传递UserID吗?,database,asp.net-membership,Database,Asp.net Membership,当userID不是要传递的对象中的字段,但在提交数据时仍需要使用userID交叉引用表时,向数据层提交数据时,我应该调用成员类以获取数据层的userID,还是应该将userID作为参数从一个级别传递到另一个级别?(即从业务层到数据层?) (或者这两种方式都不重要?) 控制器或业务层: MembershipUser user = Membership.GetUser(); Guid userID = (Guid)user.ProviderUserKey; DL.SaveObject (Obj
MembershipUser user = Membership.GetUser();
Guid userID = (Guid)user.ProviderUserKey;
DL.SaveObject (Object, userID);
或
在数据层中执行此操作:
SaveObject(Object)
{
MembershipUser user = Membership.GetUser();
Guid userID = (Guid)user.ProviderUserKey;
...
...
}
一般来说,我更喜欢在SaveObject()中看到GetUser(),因为这样可以将业务层从中抽象出来,并减少调用GetUser()的代码量。但这取决于需求。如果您需要根据用户是谁来应用业务规则,那么(同时)将其放在业务层可能更有意义 授权/认证是AOP(面向方面编程)最适合处理的交叉问题之一 更新:
CraigTP提出了一个有效的观点,即数据层不知道其数据来自何处。总的来说,我会同意。在这种情况下,数据持久性机制需要用户身份,可能是出于安全和/或审计目的。所以在这种情况下,我更愿意将用户身份访问调用置于需要它的层的控制之下。我会在另一个调用之后抽象出GetUser()实现的细节,这样数据层就不会依赖于System.Web.Security。一般来说,我更喜欢在SaveObject()中看到GetUser(),因为这样可以将业务层从中抽象出来,并减少调用GetUser()的代码量。但这取决于需求。如果您需要根据用户是谁来应用业务规则,那么(同时)将其放在业务层可能更有意义 授权/认证是AOP(面向方面编程)最适合处理的交叉问题之一 更新:
CraigTP提出了一个有效的观点,即数据层不知道其数据来自何处。总的来说,我会同意。在这种情况下,数据持久性机制需要用户身份,可能是出于安全和/或审计目的。所以在这种情况下,我更愿意将用户身份访问调用置于需要它的层的控制之下。我会在另一个调用后面抽象出GetUser()实现的细节,这样数据层就不会依赖于System.Web.Security。虽然这确实是一个跨领域的问题,但我个人的偏好是这样的代码:
MembershipUser user = Membership.GetUser();
Guid userID = (Guid)user.ProviderUserKey;
不应位于数据层中
我喜欢在比数据层(通常是业务层)更高的层中看到此类代码,因为我希望我的数据层完全不知道它将读取/写入/处理的数据来自何处。我希望我的数据收集主要在UI层(在用户提供数据/输入的情况下)完成,并且可能在业务层中进行更多的数据收集(例如收集用户ID或检索用户的角色/授权)
将这样的代码放在业务层可能会导致在许多不同的域对象之间重复此代码,但是,通过将此代码抽象到它自己的对象中,并使用对象组合允许其他域对象访问它,可以缓解此问题。虽然这确实是一个交叉问题,我个人偏好的代码如下:
MembershipUser user = Membership.GetUser();
Guid userID = (Guid)user.ProviderUserKey;
不应位于数据层中
我喜欢在比数据层(通常是业务层)更高的层中看到此类代码,因为我希望我的数据层完全不知道它将读取/写入/处理的数据来自何处。我希望我的数据收集主要在UI层(在用户提供数据/输入的情况下)完成,并且可能在业务层中进行更多的数据收集(例如收集用户ID或检索用户的角色/授权)
将这样的代码放在业务层可能会导致在许多不同的域对象之间重复这些代码,但是,通过将这些代码抽象到自己的对象中,可以缓解这种情况,并使用对象组合允许其他域对象访问它。将输入传递到DataAccessLayer应由控制器或BL完成。我不希望在DAL中包含除数据读/写之外的任何内容。(在这种情况下,DAL被赋予确定当前登录用户的任务)向DataAccessLayer传递输入应由控制器或BL完成。我不希望在DAL中包含除数据读/写之外的任何内容。(在这种情况下,DAL被赋予确定当前登录用户的任务)