我们的 Asp.net Web 应用程序使用 LINQ-to-SQL(Stored Procs 被拖放到 dbml 文件上以创建类),三层架构类似于下面的架构。我刚刚创建了粗略的方法来给读者正确的想法,以便他能够很好地回答。
namespace MyDataLayer
{
public class MyDataAccess
{
// global instance of datacontext
MyDataModelDataContext myDB = new MyDataModelDataContext(); (#1)
public void GetUserIDByUsername(string sUserName, ref int iUserID)
{
int? iUserIDout = 0;
// this will make call to SP in SQL DB
myDB.USP_RP_GETUSERIDBYUSERNAME(sUserName, "", ref iUserIDout);
iUserID = (int)iUserIDout;
}
public List<USP_APP_USERDETAILSResult> GetUserDetails(string sUserIDs)
{
// this will make call to SP in SQL DB
return myDB.USP_APP_USERDETAILS(sUserIDs).ToList();
}
...
... // several CRUD methods
}
}
namespace MyBusinessLayer
{
public class SiteUser
{
// global DataAccess instance
MyDataLayer.MyDataAccess myDA = new MyDataAccess(); (#2)
public void GetUserIDByUsername(string sUserName, ref int iUserID)
{
myDA.GetUserIDByUsername(sUserName, ref iUserID);
}
public List<USP_APP_USERDETAILSResult> GetUserDetails(string sUserIDs)
{
// this will make call to SP in SQL DB
return myDA.GetUserDetails(sUserIDs);
}
...
... // several CRUD methods
}
}
namespace MyWebApplication
{
public class BaseWebPage : System.Web.UI.Page
{
// static business layer instance
public static MyBusinessLayer.SiteUser UserBLInstance = new SiteUser(); (#3)
...
}
}
// Index.aspx.cs code fragment
namespace MyWebApplication
{
public class Index : BaseWebPage
{
public void PopulateUserDropDown()
{
// using static business layer instance declared in BaseWebPage
List<USP_APP_USERDETAILSResult> listUsers = UserBLInstance.GetUserDetails("1,2,3");
// do databinding and so on ...
}
...
}
}
问题
- (Ref.#1)在 DataAccess 中有全局数据上下文是好方法吗?是/否 为什么?
- 如果您的建议是每个请求都有数据上下文,那么最佳实践是什么
- (Ref.#2)在 BusinessLayer 中拥有全局 DataAccess 实例是好方法吗?是/否 为什么?
- 如果您的建议是每个请求都有 DataAccess 实例,那么最佳做法是什么
- (参考#3)在 BaseWebPage 中声明的静态业务层实例是好方法吗?是/否 为什么?
- 一般管理 BL 实例和 DL 实例的生命周期的最佳方法
我们在生产服务器上面临周期性的 InvalidCastException,这是一个非常简单的方法,如果我从 IIS 重新启动我的应用程序,它可以正常工作。当出现此问题时,我们可以从 SQL Management Studio 访问相同的数据库并执行相同的 SP
我们对这个问题的主要怀疑是 DataContext 管理不善,我在网上阅读了很多关于管理 DataContext 生命周期的文章,但我现在对各种方法感到困惑。这就是为什么我详细阐述了我的问题,以便许多处于相同情况的人可以清楚地了解问题/答案。