Я пытаюсь настроить внедрение зависимостей в моем приложении Xamarin Forms. У меня есть инжектор-конструктор, работающий с Simple Injector. Однако, когда я начинаю использовать Entity Framework, я сталкиваюсь со следующей проблемой:
Я регистрирую свой AppDbContext (наследует от DbContext) со следующими строками:
_container.Register<AppDbContext>(() => {
return new AppDbContext(new DbContextOptionsBuilder<AppDbContext>().UseSqlServer(connectionString).Options);
});
Это приводит к ошибке ниже:
- [Одноразовый временный компонент] AppDbContext зарегистрирован как временный, но реализует IDisposable ...
Поэтому я затем изменяю строки выше на:
_container.Register<AppDbContext>(() => {
return new AppDbContext(new DbContextOptionsBuilder<AppDbContext>().UseSqlServer(connectionString).Options);
}, Lifestyle.Scoped);
А также задайте для параметра defaultscopedlifestyle следующее:
_container.Options.DefaultScopedLifestyle = new ThreadScopedLifestyle();
Это выдает следующую ошибку:
AppDbContext регистрируется с использованием образа жизни Thread Scoped, но экземпляр запрашивается вне контекста активной области (Thread Scoped).
Наконец, я изменяю defaultscopedlifestyle на единственный другой вариант, который я могу найти:
_container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();
Но затем я получаю эту ошибку ниже:
AppDbContext зарегистрирован с использованием образа жизни «Asyn c Scoped», но экземпляр запрашивается вне контекста действия ve (Asyn c Scoped) область применения. Пожалуйста, смотрите https://simpleinjector.org/scoped для получения дополнительной информации о том, как применять образ жизни и управлять областями.
Все, что мне нужно сделать, это зарегистрировать AppDbContext, чтобы его можно было использовать с платформой сущностей. , Я использую следующую строку в моем MVC проекте, который использует одну и ту же разделяемую библиотеку классов:
services.AddDbContext<AppDbContext>
Так что мне нужно иметь возможность сделать вышеуказанную строку с простым инжектором.
Надеюсь это достаточно информации, если вам нужно узнать что-то еще, не стесняйтесь спрашивать.
Обновление 5 февраля Один из моих репозиториев: publi c class HolidayBookingRepository: IHolidayBookingRepository {
private только для чтения контекст AppDbContext;
public HolidayBookingRepository(AppDbContext context)
{
this.context = context;
}
public async Task<HolidayBooking> GetById(int Id)
{
return await context.HolidayBooking.AsNoTracking().Where(h =>h.HolidayBookingId == Id).FirstOrDefaultAsync<HolidayBooking>();
}
}
Моя ViewModel:
IHolidayBookingRepository _holidayRepo;
public HomePageViewModel(IHolidayBookingRepository holidayRepo)
{
_holidayRepo = holidayRepo;
}
public override async void OnAppearingAsync()
{
try
{
base.OnAppearingAsync();
HolidayBooking booking = await _holidayRepo.GetById(42);
Console.WriteLine(booking.Comment);
}
catch(Exception ex)
{
}
}