Это краткий отрывок из созданного мной sample project.
Необходимо определить объект модели. Вместо пользователей (потому что обработка паролей немного сложна), этот пример будет для продуктов в магазине.
Вам необходимо определить интерфейс для вашего уровня данных.
public interface IStoreRepository
{
Product GetProductById(int id);
List<Product> GetAllProducts();
void AddNewProduct(Product product);
void UpdateProduct(Product product);
void DeleteProduct(int id);
}
Тогда вы бы написать конкретный класс орудия граничного слоя данных и выполняете фактическую CR (Create Read Update Delete). Вот как выглядит MS SQL Server.
public class MsSqlStoreRepository : IStoreRepository
{
private string ConnectionString { get; set; }
public MsSqlStoreRepository(string connectionString)
{
ConnectionString = connectionString;
}
private Product GenerateProductFromDataRow(DataRow row)
{
return new Product()
{
Id = row.Field<int>("id"),
Name = row.Field<string>("name"),
Description = row.Field<string>("description"),
Price = row.Field<double>("price")
};
}
public Product GetProductById(int id)
{
var command = new SqlCommand("select id, name, description, price from products where [email protected]");
command.Parameters.AddWithValue("id", id);
var dt = MsSqlDatabaseHelpers.GetDataTable(command, ConnectionString);
return dt.AsEnumerable().Select(r => GenerateProductFromDataRow(r)).Single();
}
public List<Product> GetAllProducts()
{
var command = new SqlCommand("select id, name, description, price from products");
var dt = MsSqlDatabaseHelpers.GetDataTable(command, ConnectionString);
return dt.AsEnumerable().Select(r => GenerateProductFromDataRow(r)).ToList();
}
public void AddNewProduct(Product product)
{
var command = new SqlCommand("insert into products (id, name, description, price) values (@id, @name, @description, @price)");
command.Parameters.AddWithValue("id", product.Id);
command.Parameters.AddWithValue("name", product.Name);
command.Parameters.AddWithValue("description", product.Description);
command.Parameters.AddWithValue("price", product.Price);
MsSqlDatabaseHelpers.ExecuteNonQuery(command, ConnectionString);
}
public void UpdateProduct(Product product)
{
var command = new SqlCommand("update products set [email protected], [email protected], [email protected] where [email protected]");
command.Parameters.AddWithValue("id", product.Id);
command.Parameters.AddWithValue("name", product.Name);
command.Parameters.AddWithValue("description", product.Description);
command.Parameters.AddWithValue("price", product.Price);
MsSqlDatabaseHelpers.ExecuteNonQuery(command, ConnectionString);
}
public void DeleteProduct(int id)
{
var command = new SqlCommand("delete from products where id=:id");
command.Parameters.AddWithValue("id", id);
MsSqlDatabaseHelpers.ExecuteNonQuery(command, ConnectionString);
}
}
Теперь мы следили за разделом проблем, и единственное, что осталось, - написать фактическую логику пользовательского интерфейса. Предполагая, что вы используете веб-форму, это может выглядеть следующим образом:
[Inject] //using Ninject to inject MsSqlStoreRepository
public IStoreRepository Repo { get; set; }
protected void AddProductBtn_Click(object sender, EventArgs e)
{
Product product = new Product()
{
Id = Int32.Parse(IdTB.Text),
Name = NameTB.Text,
Description = DescriptionTB.Text,
Price = Double.Parse(PriceTB.Text)
};
Repo.AddNewProduct(product);
//now clear the form or show success message etc
}
Обратите внимание, что мой веб-страница не имеет ни малейшего представления о о MsSqlStoreRepository
, потому что это только общается через IStoreRepository
. Это делает абсолютно уверенным, что я не выполняю какие-либо материалы, связанные с базой данных на своей веб-странице, и что я могу свободно менять базы данных по своему усмотрению, создавая новый конкретный класс, который наследуется от IStoreRepository
. И если вы посмотрите на ссылку в верхней части моего ответа, вы увидите, что я сделал именно это.
Нет, модель должна * не * подключаться к базе данных. Ваш уровень данных должен отвечать за это, а не за модель. ** Разделение проблем! ** – mason
Причина, по которой модель не должна подключаться к базе данных, заключается в том, что это не работа с моделями. Модель должна содержать только информацию о объекте домена и любой логике домена (бизнеса). Таким образом, вы можете изменить базу данных, не затрагивая модель. У меня есть пример этого в [демонстрационном проекте] (https://github.com/mason-mcglothlin/FancyStoreDemo), который я создал, где вы можете поменять местами и слоями данных без необходимости изменять модель, поскольку это следует принцип разделения идей. – mason
Я никогда не слышал о «слое данных». Я предполагаю, что могу сделать это без модели - просто введите код в методе нажатия кнопки, который подключается к базе данных, но это кажется каким-то неудовлетворительным ... –