2011-01-06 62 views
7

我有以下數據訪問層(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是否正確?

請提出更正或更好的方法。我沒有很多層編寫代碼的經驗。

+2

如果你不能抽出時間來完整地闡明你的問題(用P1而不是Please),那麼你如何期待某人花時間回答你的問題或幫助你? – 2011-01-06 18:22:04

+7

@喬治,我不知道這是否會傷害某人,但只是爲了節省讀者太多,我經常使用它。相反,我專注於寫下我的榜樣。這並不意味着我不會批評人們的時間和他們的迴應。 – 2011-01-06 18:39:18

+0

你爲什麼要這樣做而不是使用像LLBLGen或Dapper這樣的ORM?沒有必要重新發明輪子。 – 2012-01-24 18:57:32

回答

12

無這些類的應static解決混凝土DALS。我不認爲你應該命名你的類DAL,因爲它是數據訪問層的縮寫,而類本身並不是一層(至少在我看來)。您可以使用廣泛採用的術語repository。我建議你做類似如下:

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的一個實例。您可以使用Dependency Injection(DI)框架自動爲您執行此操作,例如Castle Project的溫莎城堡。它將允許您在配置文件或代碼中指定從抽象(UserRepository)到具體實現(例如SqlUserRepository)的映射。

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

6

拙見

  1. 使用接口而不是抽象類,如果用戶沒有任何等級制度。
  2. 編寫一個通用的DAL,以便您可以重用它作爲DAL層的外觀。
  3. 由DI框架