数据访问层(DAL)设计

3

我正在使用.Net企业库数据访问应用程序块来设计我的数据访问层。

在我的Category DAL类中,我有像这样的方法:

GetProductsInCategory(int CatId),GetAllProducts,GetCategories等。

我的问题是:我应该把这行代码放在哪里?

DatabaseFactory.CreateDatabase("MyDB");

我应该将它放在每个方法上方还是应该有一个基类,该基类将返回Database对象给我的DAL类。

此外,我应该将这些DAL类方法保持为静态的吗?

3个回答

3

我更喜欢一个基础类返回常见对象,比如连接,在你的例子中是Database。

这里有关于设计数据访问层的参考:.NET应用程序架构:数据访问层

我使用Microsoft Enterprise Library Data Access Application Block。它做了这里提到的大部分事情,但像连接或事务这样的常规内容会放在我的基础类中。

alt text

DataServiceBase类提供通用的数据访问功能,如打开数据库连接、管理事务、设置存储过程参数、执行命令等等。换句话说,DataServiceBase类包含一般的数据库代码,并为您提供一组辅助方法,供各个数据服务类使用。派生的数据服务类使用DataServiceBase中的辅助方法来实现特定的目的,如执行特定的命令或运行特定的查询。


如果您有一个基类,那么您不需要工厂方法,因为派生类可以直接访问受保护的Database _myDatabase - Dead account
@Ian Quigley:是的,您需要实例化您的“protected Database _myDatabase”,因此您需要在基类构造函数中使用工厂类。 - Canavar
感谢您的建议。我将让所有的DAL类都派生自一个名为DBManager的基类。这个类将有一个受保护的方法叫做GetDatabase(),其中包含以下代码: return DatabaseFactory.CreateDatabase("MyDB"); 而我的派生类中的方法看起来会像这样:...(续在下一条评论中) - Jeremy Thomson
public DataSet GetProductsInCategory(int Category) { Database db = base.GetDatabase(); DbCommand dbCommand = db.GetStoredProcCommand("GetProductsByCategory"); db.AddInParameter(dbCommand, "CategoryID", DbType.Int32, Category); return db.ExecuteDataSet(dbCommand); } 这个数据访问层的设计看起来还可以吗? - Jeremy Thomson

1
感谢您的建议。我将让所有的DAL类都派生自一个名为DBManager的基类。这个类将有一个受保护的方法叫做GetDatabase(),其中包含代码:return DatabaseFactory.CreateDatabase("MyDB")。我的派生类中的方法看起来会像这样:...
public DataSet GetProductsInCategory(int Category) 
{
Database db = base.GetDatabase(); 
DbCommand dbCommand = db.GetStoredProcComman("GetProductsByCategory"); 
db.AddInParameter(dbCommand, "CategoryID", DbType.Int32, Category); 
return db.ExecuteDataSet(dbCommand);
} 

这个DAL设计看起来还可以吗?


0
我建议使用SubSonic来进行数据访问层和对象生成。它实现了Microsoft的应用程序块,但同时提供了简单(而且健壮)的查询功能,例如:
SubSonic.Query qry = new SubSonic.Query(Usr.Schema);
qry.SetSelectList(Usr.Columns.UserPkid);
qry.QueryType = SubSonic.QueryType.Select;
qry.AddWhere(Usr.UsernameColumn.ColumnName, SubSonic.Comparison.Equals, Username);

using (IDataReader reader = qry.ExecuteReader())
{
    while (reader.Read())
    {
        Trace.WriteLine("Fetched User Pkid [" + reader[Usr.Columns.UserPkid].ToString() + "]");
    }
}

当然,它实现了ActiveRecord模式,因此对象类具有.Delete()、.Add()、.Get()等类型方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接