Как реализовать шаблон репозитория для двух или более объектов

Я пытаюсь реализовать шаблон репозитория для проекта 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 методов в универсальном интерфейсе репозитория.

Как реализовать эти методы? Могу ли я написать запросы для вставки курса и студента в пользовательский репозиторий или мне нужно делегировать это отдельным репозиториям, чтобы выполнить вставку?

Какой подход является лучшим?

0 ответов

Другие вопросы по тегам