Каков рекомендуемый способ запуска функций идентификации asp.net в транзакции?

Использование идентификатора asp.net версия RTW< /а>.

Мне нужно выполнить несколько действий в транзакции, включая вызовы функций UserMananger и другие операции с моим DbContext (например: создать нового пользователя, добавить его в группу и выполнить некоторые операции бизнес-логики).

Как мне это сделать?

Мои мысли следуют.

Область транзакции

using (var scope = new TransactionScope(TransactionScopeOption.Required))
{
    // Do what I need
    if (everythingIsOk) scope.Complete();
}

Проблема в том, что все функции UserManager асинхронны, а TransactionScope не предназначена для работы с async/await. Похоже, это решено в .Net Framework 4.5.1. Но я использую веб-сайты Azure для размещения своих сборок проектов, поэтому пока не могу ориентироваться на 4.5.1.

Транзакция базы данных

public class SomeController : Controller
{
    private MyDbContext DbContext { get; set; }
    private UserManager<User> UserManager { get; set; }

    public AccountController()
    {
        DbContext = new MyDbContext()
        var userStore = new UserStore<IdentityUser>(DbContext);
        UserManager = new UserManager<IdentityUser>(userStore);
    }

    public async ActionResult SomeAction()
    {
        // UserManager uses the same db context, so they can share db transaction
        using (var tran = DbContext.Database.BeginTransaction())
        {
            try
            {
                // Do what I need
                if (everythingIsOk)
                    tran.Commit();
                else
                {
                    tran.Rollback();
                }
            }
            catch (Exception)
            {
                tran.Rollback();
            }
        }
    }
}

Кажется, это работает, но как я могу его протестировать?

Конструктор UserManager<> принимает IUserStore<>, поэтому я могу легко его заглушить.

Конструктор UserStore<> принимает DbContext, понятия не имею, как я могу это заглушить.


person aleyush    schedule 15.10.2013    source источник


Ответы (1)


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

Если вы хотите использовать фактический EF UserStore в своих тестах, это также сработает, но по умолчанию будет создаваться база данных с использованием строки DefaultConnection. Вы можете указать DatabaseInitializer, чтобы он всегда удалял/воссоздавал ваши таблицы в ваших тестах, если вы хотите обеспечить чистую базу данных для каждого теста.

person Hao Kung    schedule 15.10.2013
comment
Спасибо. Мне удалось отключить UserStore для использования транзакций (в моих тестах используются данные в памяти). - person aleyush; 16.10.2013
comment
Хао Кунг. Можете ли вы показать нам рабочий пример идентификации asp.net в проекте mvc 5 без использования Microsoft.AspNet.Identity.EntityFramework? - person taher chhabrawala; 19.10.2013