Ответ 1
У вас может быть репозиторий:
public interface IUsersRepository
{
public User GetUser(int id);
}
затем выполните его:
public class UsersRepository: IUsersRepository
{
private readonly string _connectionString;
public UsersRepository(string connectionString)
{
_connectionString = connectionString;
}
public User GetUser(int id)
{
// Here you are free to do whatever data access code you like
// You can invoke direct SQL queries, stored procedures, whatever
using (var conn = new SqlConnection(_connectionString))
using (var cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText = "SELECT id, name FROM users WHERE id = @id";
cmd.Parameters.AddWithValue("@id", id);
using (var reader = cmd.ExecuteReader())
{
if (!reader.Read())
{
return null;
}
return new User
{
Id = reader.GetInt32(reader.GetOrdinal("id")),
Name = reader.GetString(reader.GetOrdinal("name")),
}
}
}
}
}
а затем ваш контроллер может использовать этот репозиторий:
public class UsersController: Controller
{
private readonly IUsersRepository _repository;
public UsersController(IUsersRepository repository)
{
_repository = repository;
}
public ActionResult Index(int id)
{
var model = _repository.GetUser(id);
return View(model);
}
}
Таким образом, контроллер больше не зависит от реализации вашего уровня доступа к данным: используете ли вы простые ADO.NET, NHibernate, EF, другие ORM, вызывая внешнюю веб-службу, XML, вы называете ее.
Теперь все, что осталось, - настроить вашу любимую инфраструктуру DI, чтобы внедрить правильную реализацию репозитория в контроллер. Если завтра вы решите изменить технологию доступа к данным, не проблема, просто напишите другую реализацию интерфейса IUsersRepository
и перенастройте свою инфраструктуру DI, чтобы использовать ее. Не нужно прикасаться к логике контроллера.
Ваше приложение MVC больше не связано с тем, как хранятся данные. Это также упрощает unit test ваши контроллеры изолированно, поскольку они больше не жестко связаны с конкретным источником данных.