簡體   English   中英

如何正確設計數據訪問層?

[英]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 )的映射。

希望這能指出您正確的方向,請詢問您是否需要更多信息。

我的拙見

  1. 如果User沒有任何層次結構,請使用接口而不是抽象類。
  2. 編寫一個通用DAL,以便您可以將其重用為DAL層的外觀。
  3. 通過DI框架解決具體的DAL

Davy Brion在這個主題上有很多博客文章: 位於GitHub上

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM