Как реализовать шаблон репозитория для двух или более объектов
Я пытаюсь реализовать шаблон репозитория для проекта Web Api, и я запутался при реализации репозитория, в котором участвуют два или более объекта. Что будет лучшим подходом для рассмотрения этого случая?
Общий репозиторий:
public interface IRepository<T>
{
IEnumerable<T> Get();
T GetById(int Id);
int Save(T Object);
bool Update(T Object);
bool Delete(int Id);
}
Студенческое хранилище:
public class StudentRepository : IRepository<Student>
{
private IDbConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ToString());
public bool Delete(int Id)
{
int affectedRows;
using (connection)
{
connection.Open();
using (var trans = connection.BeginTransaction())
{
affectedRows = connection.Execute(StudentSql.Default.DELETE, new { Id = Id }, transaction: trans);
trans.Commit();
}
return affectedRows > 0;
}
}
public IEnumerable<Student> Get()
{
using (connection)
{
connection.Open();
IEnumerable<Student> students = connection.Query<Student>(StudentSql.Default.SELECT);
return students;
}
}
public Student GetById(int Id)
{
using (connection)
{
connection.Open();
Student student = connection.QueryFirstOrDefault<Student>(StudentSql.Default.SELECT_BY_ID, new { Id = Id });
return student;
}
}
public int Save(Student StudentModel)
{
int newRecordId;
using (connection)
{
connection.Open();
using (var trans = connection.BeginTransaction())
{
newRecordId = connection.QuerySingle<int>(StudentSql.Default.INSERT, new
{
StudentModel.First_Name,
StudentModel.Last_Name,
StudentModel.Course_Id
}, transaction : trans);
trans.Commit();
}
return newRecordId;
}
}
public bool Update(Student StudentModel)
{
int affectedRows;
using (connection)
{
connection.Open();
using (var trans = connection.BeginTransaction())
{
affectedRows = connection.Execute(StudentSql.Default.UPDATE, new
{
StudentModel.Id,
StudentModel.First_Name,
StudentModel.Last_Name,
StudentModel.Course_Id
}, transaction: trans);
trans.Commit();
}
return affectedRows > 0;
}
}
}
Обслуживание:
IRepository<Student> repository;
public StudentController(IRepository<Student> studentRepository)
{
repository = studentRepository;
transformer = studentTransformer;
}
[HttpGet]
[Route("api/v1/student")]
public IHttpActionResult Get()
{
IEnumerable<Student> students = null;
try
{
students = repository.Get();
if (students.Count<Student>() > 0)
{
return Ok(students);
}
else
{
return StatusCode(HttpStatusCode.NoContent);
//return Content(HttpStatusCode.NoContent, students);
}
}
catch (Exception ex)
{
return InternalServerError(ex);
}
}
Если я хочу, чтобы Студент вместе с курсом, то я должен написать собственный репозиторий, где он должен реализовать все 5 методов в универсальном интерфейсе репозитория.
Как реализовать эти методы? Могу ли я написать запросы для вставки курса и студента в пользовательский репозиторий или мне нужно делегировать это отдельным репозиториям, чтобы выполнить вставку?
Какой подход является лучшим?