如何正确设计数据访问层?

Mun*_*yal 8 .net c# architecture design-patterns data-access-layer

我有以下数据访问层(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
{

}
Run Code Online (Sandbox Code Playgroud)

我将存储层与User类分开,以访问方法集合,进一步调用任何自定义DAL.

是使用static在DAL执行是否正确?

请建议更正或我可以做得更好的方法.我在分层编写代码方面没有太多经验.

Kla*_*sen 13

这些课程都不应该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);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,在构造函数中UserService注入了抽象类的实例UserRepository.您可以使用依赖注入(DI)框架自动为您执行此操作,例如Castle Project中的 Windsor Castle .它允许您在配置文件或代码中指定从abstractraction(UserRepository)到具体实现(例如SqlUserRepository)的映射.

希望这能指出您正确的方向,请询问您是否需要更多信息.


Jah*_*ine 7

我的拙见

  1. 如果User没有任何层次结构,请使用接口而不是抽象类.
  2. 编写一个通用DAL,以便您可以将其重用为DAL层的外观.
  3. 通过DI框架解决具体的DAL


tij*_*vdk 6

Davy Brion在这个主题上有很多博客文章:位于GitHub上

  • 您包含的链接现已破裂.请更新它. (2认同)