i.stack.imgur.com/4oGf8.png

жно, это скорее вопрос для проверки кода, а не переполнение стека.

Я использую Dapper для MicroORM для извлечения и сохранения данных в SQL Server 2014. У меня есть DTO-классы в DTO Proj, которые представляют Данные, извлеченные из БД или сохраненные в БД.

Я использую шаблон репозитория, поэтому на моем уровне службы, если требуется репозиторий, я использую конструктор DI для внедрения этой зависимости, а затем вызываю метод в репозитории для выполнения работы.

скажем так, у меня есть 2 сервиса под названием CustomerService и CarService.

Затем у меня есть 2 репозитория: репозиторий CustomerRepository и CarRepository.

У меня есть интерфейс, который определяет все методы в каждом репозитории, а затем конкретные реализации.

Пример метода показан ниже (вызов Stored Proc для выполнения INSERT БД (обратите внимание, что фактическая строковая переменная для хранимого proc определяется как закрытая строка в верхней части класса):

    public void SaveCustomer(CustomerDTO custDTO)
    {
        using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["myDB"].ConnectionString))
        {
            db.Execute(saveCustSp, custDTO, commandType: CommandType.StoredProcedure);
        }
    }

Все это прекрасно работает, но я обнаружил, что повторяю блок using в каждом методе в каждом репозитории. У меня есть два реальных вопроса, изложенных ниже.

Есть ли лучший подход, который я мог бы использовать, возможно, каким-то образом, используя класс BaseRepository, от которого наследуется каждый другой репозиторий, и Base будет реализовывать создание экземпляра соединения с БД?

Будет ли это работать нормально для нескольких одновременно работающих пользователей в системе?

****ОБНОВИТЬ****

На основании ответа Сайласа я создал следующее

public interface IBaseRepository
{
    void Execute(Action<IDbConnection> query);
}

public class BaseRepository: IBaseRepository
{
        public void Execute(Action<IDbConnection> query)
        {
            using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["myDB"].ConnectionString))
            {
                query.Invoke(db);
            }
        }
}

Тем не менее, в моих репозиториях у меня есть другие методы, такие как ниже:

    public bool IsOnlyCarInStock(int carId, int year)
    {
        using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["myDB"].ConnectionString))
        {
            var car = db.ExecuteScalar<int>(anotherStoredSp, new { CarID = carId, Year = year },
                                commandType: CommandType.StoredProcedure);

            return car > 0 ? true : false;
        }
    }

а также

    public IEnumerable<EmployeeDTO> GetEmployeeDetails(int employeeId)
    {
        using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["myDB"].ConnectionString))
        {
            return db.Query<EmployeeDTO>(anotherSp, new { EmployeeID = employeeId },
                                commandType: CommandType.StoredProcedure);
        }
    }

Как правильно добавить их в мой базовый репозиторий, используя Generic Type T, чтобы я мог вернуть любой тип DTO или любой родной тип C #

Ответы на вопрос(2)

Ваш ответ на вопрос