Проектирование архитектуры трехслойного приложения
У меня есть трехслойное приложение следующим образом:
Presentation > Entities (VO) > Business Layer (BAL) > Data Layer (DAL)
Мне не нравится следить за вещами в этом решении:
- в бал-классах еще есть система.Ссылка на данные
- для каждого класса BAL требуется класс DAL
Мой вопрос:
- Каждая сущность во своя и каждый бал класс бал класс содержит свой класс даль. Можно ли иметь один общий класс DAL для всех классов BALs вместо того, чтобы каждый раз создавать DAL для BAL?
- Хорошо ли иметь систему?Данные в бал?
Мой код:
уровень представления:
public partial class FrmLogin : Form { private readonly UserBal _userBal; public FrmLogin() { InitializeComponent(); _userBal = new UserBal(); } private void btnSearch_Click(object sender, EventArgs e) { var userVo = _userBal.SearchByName(txtUsername.Text); } }
Пример класса во :
public class UserVo { public int IdUser { get; set; } public string Firstname { get; set; } public string Lastname { get; set; } public string Email { get; set; } }
Пример класса бал :
public class UserBal { private readonly UserDal _userDal; public UserBal() { _userDal = new UserDal(); } public UserVo SearchByName(string name) { var userVo = new UserVo(); var dataTable = _userDal.SearchByName(name); foreach (DataRow dr in dataTable.Rows) { userVo.IdUser = int.Parse(dr["t01_id"].ToString()); userVo.Firstname = dr["t01_firstname"].ToString(); userVo.Lastname = dr["t01_lastname"].ToString(); userVo.Email = dr["t01_email"].ToString(); } return userVo; } public UserVo SearchById(string _id) { var userVo = new UserVo(); var dataTable = _userDal.SearchById(_id); foreach (DataRow dr in dataTable.Rows) { userVo.IdUser = int.Parse(dr["t01_id"].ToString()); userVo.Firstname = dr["t01_firstname"].ToString(); userVo.Lastname = dr["t01_lastname"].ToString(); userVo.Email = dr["t01_email"].ToString(); } return userVo; } }
Пример класса DAL:
public class UserDal { private readonly DbManager _dbManager; public UserDal() { _dbManager = new DbManager("DBConnection"); } public DataTable SearchByName(string username) { var parameters = new List<IDbDataParameter> { _dbManager.CreateParameter("@FirstName", 50, username, DbType.String), }; //_dbManager.SearchByName returns DataTable object return _dbManager.SearchByName("SELECT * FROM tbUsers WHERE FirstName=@FirstName", CommandType.Text, parameters.ToArray()); } public DataTable SearchById(string id) { var parameters = new List<IDbDataParameter> { _dbManager.CreateParameter("@Id", 50, id, DbType.Int32), }; //_dbManager.SearchById returns DataTable object return _dbManager.SearchById("SELECT * FROM tbUsers WHERE Id=@Id", CommandType.Text, parameters.ToArray()); } }
Что я уже пробовал:
как показано выше текущий дизайн кода