Как использовать Simple Injector с Xamarin Forms и Entity Framework Core? - PullRequest
1 голос
/ 04 февраля 2020

Я пытаюсь настроить внедрение зависимостей в моем приложении 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)
    {
    }
}
...