2012-03-23 3 views
4

В проекте MVC 3 я использую EF4, IoC и Agatha-RRSL в качестве уровня обслуживания.Dapper. IoC, Testing и Agatha

К счастью, на этой неделе я нашел Dapper, и я перехожу из EF4 в Dapper!

Обычно я впрыснуть Generic Repository в моих обработчиках Request Агата ...

Но как я должен использовать Щеголеватый?

1) Следует ли вводить IDbConnection в обработчик Agatha? Затем внутри обработчика я использую его с помощью Dapper Query или Dapper Execute? Можно ли это проверить? А насчет насмешек?

2) Должен ли я создать общий репозиторий для Dapper? Возможно, хранилище будет что-то вроде:

public class Repository { 

    private IDbConnection _connection; 

    public Repository(IDbConnection connection) { 
    _connection = connection; 
    } // Repository 

    public Int32 Execute(String sql, dynamic param = null) { 
    return _connection.Execute(sql, param); 
    } // Execute 

    // Query code 
} 

И в IDbConnection будет введен здесь.

И репозиторий будет введен внутри обработчиков.

Не знаете, как это проверить ...

3) Должен ли я просто поместить весь мой код внутри обработчика?

using (SqlConnection connection = new SqlConnection(connectionString)) { 
connection.Execute(@"insert Roles(Name) values (@name)", new { name = "Role" }); 
} 

Но как насчет тестирования?

4) Я понимаю, что Dapper использует статические методы. Разве это не вызывает проблем с памятью?

Извините за так много вопросов ... Я пытаюсь сделать это правильно.

Спасибо, Miguel

+0

Для ввода записей вы также можете посмотреть Dapper-Rainbow. (Доступно на NuGet). PS: 3) - dapper восстанавливает открытое соединение. – Alex

+0

Да, я только что нашел Dapper-Rainbow ... Но я рассматриваю возможность взломать этот код в 3: База данных, которая содержит соединение, сеанс трансакций и репозиторий для этих методов. Как вы думаете? Я думаю, что это лучше для тестирования. Как вы думаете? Я отправлю свой код здесь ... –

+0

что вы сделали финнали? – GorillaApe

ответ

0

Поздний ответ, но я хочу отметить, что ваша реализация хранилища действительно «объект доступа к данным». Репозитории занимаются целыми агрегатами, т.е. группа вещей, которые принадлежат друг другу. В идеале, ваш интерфейс должен принимать и возвращать только объекты совокупного корневого типа (например, Repository<User> может иметь методы void Update(User user) {} или IEnumerable<User> Find(...) {}).

Использование или наличие какого-либо механизма сохранения является деталью реализации и обычно не относится к интерфейсу репозитория и не будет говорить на SQL.