[英]How do I design a Data Access Layer appropriately?
我有以下數據訪問層(DAL)。 我想知道它是否設置正確,或者我是否需要改進它?
public class User
{
}
//Persistence methods
static class UserDataAccess
{
UsersDAL udal = // Choose SQL or FileSystem DAL impl.
InsertUser(User u)
{
// Custom logic , is 'u' valid etc.
udal.Insert(u);
}
}
abstract class UsersDAL
{
GetUserByID();
InsertUser(u);
...
}
// implementaitons of DAL
static class UsersSQLStore : UsersDAL
{
}
static class UsersFileSystemStore : UsersDAL
{
}
我將存儲層與User類分開,以訪問方法集合,進一步調用任何自定義DAL。
在DAL實現中使用static
是否正確?
請建議更正或我可以做得更好的方法。 我在分層編寫代碼方面沒有太多經驗。
這些類都不應該是static
。 我認為你不應該把你的類命名為DAL
,因為它是數據訪問層的縮寫,而一個類本身不是一個層(至少在我看來)。 您可以使用廣泛采用的術語庫 。 我建議你做類似以下的事情:
public class User{
}
public abstract class UserRepository{
public abstract void InsertUser(User user);
}
public class SqlUserRepository : UserRepository{
public override void InsertUser(User user)
{
//Do it
}
}
public class FileSystemUserRepository : UserRepository{
public override void InsertUser(User user)
{
//Do it
}
}
public class UserService{
private readonly UserRepository userRepository;
public UserService(UserRepository userRepository){
this.userRepository = userRepository;
}
public void InsertUser(User user){
if(user == null) throw new ArgumentNullException("user");
//other checks
this.userRepository.InsertUser(user);
}
}
請注意, UserService
在其構造函數中注入了抽象類UserRepository
的實例。 您可以使用依賴注入 (DI)框架自動為您執行此操作,例如Castle Project中的 Windsor Castle。 它允許您在配置文件或代碼中指定從抽象( UserRepository
)到具體實現(例如, SqlUserRepository
)的映射。
希望這能指出您正確的方向,請詢問您是否需要更多信息。
我的拙見
Davy Brion在這個主題上有很多博客文章: 位於GitHub上
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.