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 #