Сначала вы создаете одно место на уровне данных для получения информации о соединении. Это может быть закрытый член, если ваш уровень данных ограничен одним классом, или внутренний элемент, если уровень охватывает всю сборку. Он может вернуть строку соединения или сам фактический объект соединения, но главное, что он вообще не отображается вне уровня данных:
private static ConnectionString { get { // read from config file once.... return ""; } }
private SqlConnection getConnection()
{
SqlConnection result = new SqlConnection(ConnectionString);
result.Open(); // I like to open it in advance, but that's less common
return result; // you'll want some error handling code in here as well
}
Затем вы предоставляете открытые методы на уровне данных, которые соответствуют интерфейсу, который вы хотите предоставить бизнес-уровню. В хорошо разработанном приложении это обычно будет соответствовать хранимым процедурам, и это звучит как то, что вы собираетесь, но иногда это не совсем хорошо работает. Например, вам может потребоваться вызвать несколько процедур из одного метода.
Что бы вы ни делали, метод должен принимать строго типизированные значения параметров для использования при вызове процедур. Есть некоторые споры о том, должен ли метод возвращать бизнес-объект или корд данных. Лично я склоняюсь к тому, чтобы возвращать шнур данных, но предоставляю дополнительный «слой», где строки данных транслируются в строго типизированные бизнес-объекты:
public IDataRecord GetXYZ(int id)
{
DataTable dt = new DataTable();
using (var cn = getConnection())
using (var cmd = new SqlCommand("getXYZ"))
{
cmd.CommandType = CommandTypes.StoredProcedure;
cmd.Parameters.Add("@ID", SqlDbType.Int).Value = id;
using (var rdr = cmd.ExecuteReader())
{
dt.Load(rdr);
}
}
//obviously put a little more work into your error handling
if (dt.Rows.Count <= 0)
throw new Exception("oops");
return dt.Rows[0];
}
public class XYZFactory
{
public static XZY Create(IDataRecord row)
{
XYZ result = new XYZ();
result.id = row["ID"];
result.otherfield = row["otherfield"];
return result;
}
}