Я обеспокоен тем, что вы не получаете не конструкторов, а принцип единой ответственности и слабую связь.
Например, приведенный выше код означает:
- модель вашего домена содержит код доступа к данным
- вы не используете повторно какой-либо код из базового класса, который может быть в первую очередь введен логикой доступа к данным
- объект вашего домена знает о структурах данных, отличных от себя или его членов, таких как DataTable или DataRow, которые связывают его с этими структурами данных и затрудняют использование других структур данных.
Конечно, это предполагает, что вы не используете модель ActiveRecord, которая, как представляется, имеет место здесь, но все же будет реализована с жесткой связью.
Я предпочитаю, чтобы объект домена содержал только логику, связанную с хранением и управлением подлинными данными Клиента, и ничего больше. Как таковой мой конструктор для него будет:
class Customer
{
public Customer(int id, string firstName, string LastName)
{
Id = id;
FirstName = firstName;
LastName = lastName;
}
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
ОБНОВЛЕНИЕ: Это, как говорится, является основной причиной, почему некоторые люди предпочитают ORM, которые допускают POCO, такие как NHibernate: нет необходимости помещать туда логику загрузки данных.
Если бы это было сделано, например, в NHibernate, вам понадобился бы базовый класс DomainObject:
public class Customer : DomainObject
Что, в свою очередь, может быть использовано реализацией IRepository NHibernate:
public class Repository<T> : IRepository where T : DomainObject
Этот Repository
объект будет содержать весь код, необходимый для операций CRUD.
Если вы хотите придерживаться ADO.NET, одним из возможных решений является создание объектов диспетчера DAL для всей загрузки:
public class CustomerManager
{
public IList<Customer> LoadCustomers()
{
//load all customers here
foreach (DataRow dr in dt.Table[0])
{
yield return new Customer((int) dr["Id"], dr["FirstName"].ToString(), dr["LastName"].ToString());
}
}
public Customer LoadCustomerByID(int id)
{
//load one customer here
return new Customer((int) dr["Id"], dr["FirstName"].ToString(), dr["LastName"].ToString());
}
}
Конечно, здесь гораздо больше возможностей для дальнейшего продвижения повторного использования кода.