Ни один из этих классов не должен быть 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
в его конструкторе.Вы можете использовать инфраструктуру Dependency Injection (DI), чтобы сделать это автоматически, например, Виндзорский замок из Castle Project .Это позволит вам указать отображение от абстракции (UserRepository
) до конкретной реализации (например, SqlUserRepository
) в файле конфигурации или в коде.
Надеюсь, что это указывает вам верное направление, ипожалуйста, спросите, если вам нужна дополнительная информация.