Я добавил PayloggerService в классе Discountservice и я называю его logmessage () в 4 разных местах В скидке Scountservice .
Это последовательность методов, выполненных в одном запросе:
Код: Выделить всё
Pay()
-> DiscountService -> DiscountService.A()
-> PayLoggerService.LogMessage()
-> DiscountService.B() -> PayLoggerService.LogMessage().
< /code>
Проблема: < /p>
DbContext
ошибка:
не может получить доступ к экземпляру утилизированного контекста. Распространенной причиной этой ошибки является утилизация экземпляра контекста, который был разрешен от инъекции зависимостей, а затем пытался использовать один и тот же экземпляр контекста в другом месте вашего приложения. Это может произойти, если вы звоните «распоряжаться» на экземпляре контекста или обертываете его в оператор использования. Если вы используете инъекцию зависимостей, вы должны позволить контейнеру для инъекции зависимости позаботиться об утилизации экземпляров контекста
Это происходит после Scountservice.a () Вызовы logMessage () , поскольку logmessage () вызывает savechangesasync () в конце:
Код: Выделить всё
public class DiscountService
{
private readonly PayLoggerService _payLoggerService;
public DiscountService(PayLoggerService payLoggerService)
{
_payLoggerService = payLoggerService;
}
// NOT ASYNC. Has too many references to make it async now.
public string A()
{
// Do some work
_payLoggerService.LogMessage(message).ConfigureAwait(false);
}
// This will not be entered if LogMessage(executed from A(), will call SaveChangesAsync())
public string B()
{
// Do some work
_payLoggerService.LogMessage(message).ConfigureAwait(false);
}
}
public class PayLoggerService : GeneralService
{
public PayLoggerService(PayingContext dbContext) : base(dbContext)
{
}
public async Task LogMessage(string message)
{
// Irrelevant code
var bettingHistory = new BettingHistory
{
// Irrelevant code
};
// DbScope is of type PayingContext, created in GeneralService.cs
await DbScope.PayLogs.AddAsync(bettingHistory);
await DbScope.SaveChangesAsync(); // This line causes an error.
}
}
< /code>
Возможные решения, о которых я подумал: < /p>
[*] Реализовать единицу работы и вызовать Savechanges < /code> оттуда в Pay ()
[*] реализация dbcontextfactory и создавать новый экземпляр dbcontext каждый раз, когда мне это нужно
< /ul>
Есть ли что -нибудь лучше?>
Подробнее здесь: https://stackoverflow.com/questions/794 ... d-cant-dec