Какой код лучше всего использовать шаблон репозитория для контекста базы данных? - PullRequest
0 голосов
/ 10 мая 2019

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

Это для проекта MVC 5, который я запускаю, имея в виду шаблон хранилища.

Это первый подход: Я использую конструктор для установки контекста де БД, и внутри каждого метода, который я использую,

public class EmployeeRepository : IEmployeeRepository
{
    private DBModel contextBD;

    public EmployeeRepository(DBModel contextBD)
    {
        this.contextBD = contextBD;
    }

    public async Task<bool> Add(Employee employee)
    {
        using (contextBD)
        {
            contextBD.Employee_Table.Add(new Employee_Table()
            {
                LLP_Id = employee.id,
                Name = employee.name,
            });
            await contextBD.SaveChangesAsync();
        }
        return true;
    }
}

Второй подход заключается в следующем: Я не использую конструктор, а устанавливаю контекст в блоке using

public class EmployeeRepository : IEmployeeRepository
{
    public async Task<bool> Add(Employee employee)
    {
        using (DBModel contextBD = new DBModel())
        {
            contextBD.Employee_Table.Add(new Employee_Table()
            {
                LLP_Id = employee.id,
                Name = employee.name,
            });
            await contextBD.SaveChangesAsync();
        }
        return true;
    }
}

Какой из них будет работать лучше, какой является наилучшей практикой и почему, каковы преимущества того или иного.

1 Ответ

0 голосов
/ 10 мая 2019

В первом примере, поскольку вы вводите его в IoC, вам не следует заключать его в оператор using, поскольку этот экземпляр будет использоваться всеми методами для этого вызова. (При условии, что введен IoC.)

В то время как второй вариант будет работать, вы не можете проводить модульное тестирование, поскольку теперь оно жестко запрограммировано.

Я бы порекомендовал третий вариант. Я хотел бы ввести ContextFactory. Это будет выглядеть примерно так:

public class EmployeeRepository : IEmployeeRepository
{
    private IDBModelFactory factory;

    public EmployeeRepository(IDBModelFactory factory)
    {
        this.factory = factory
    }

    public async Task<bool> Add(Employee employee)
    {
        using (var contextBD = factory.Create())
        {
            contextBD.Employee_Table.Add(new Employee_Table()
            {
                LLP_Id = employee.id,
                Name = employee.name,
            });
            await contextBD.SaveChangesAsync();
        }
        return true;
    }
}

В этом случае реализация метода Create() будет просто return new DBModel(), и теперь вы готовы!

...