русский
Germany.ruForen → Архив Досок→ Programmierung

Где разрешать свободу?

717  
AlexNek патриот11.05.23 20:29
AlexNek
NEW 11.05.23 20:29 

Абстракцию вроде не очень любят, поэтому начну с конкретики.

Есть такая штука как ContextFactory (заголовок Using a DbContext factory)

https://learn.microsoft.com/en-us/ef/core/dbcontext-config...


Varaint 1

public class MyDbRepository: IMyDbRepository
{
    private readonly IDbContextFactory<ApplicationDbContext> _contextFactory;
    public MyController(IDbContextFactory<ApplicationDbContext> contextFactory)
    {
        _contextFactory = contextFactory;
    }
    public void DoSomething()
    {
        using (var context = _contextFactory.CreateDbContext())
        {
            // ...
        }
    }
}

Variant 2

public class MyDbRepository: IMyDbRepository
{
    private readonly ApplicationDbContext _context;
    public MyController(ApplicationDbContext context)
    {
        _context = context;
    }
    public void DoSomething()
    {
        {
            // use _context...
        }
    }
}
...application part....
IMyDbRepository repo= 'over DI';
using(ApplicationDbContext  context = GetContextFromFacroty())
{
   repo.Dosomething
}

В варинте 1 свобода на уровне репозитория. В варинте 2 - свобода на уровне приложения.


Что выбираем и почему?

#1 
Murr патриот11.05.23 22:14
Murr
NEW 11.05.23 22:14 
in Antwort AlexNek 11.05.23 20:29

Что выбираем и почему?

-----

По задаче.

Статический коннект к базе - достаточно просто DbContext.

Динамическое переключение между хранилищами - будь любезен слепить фабрику контекстов.


И это... проверь код - инициация вне конструктора работать не должна.

#2 
AlexNek патриот11.05.23 23:12
AlexNek
NEW 11.05.23 23:12 
in Antwort Murr 11.05.23 22:14
Динамическое переключение между хранилищами

не надо

проверь код

какой именно? То что я написал, просто так для понимания проблемы, хотя и там ошибки не вижу. инициация вне конструктора работать не должна - конкретнее мона? смущ

#3 
Murr патриот11.05.23 23:28
Murr
11.05.23 23:28 
in Antwort AlexNek 11.05.23 23:12

не надо

-----

Значит фабрика - лишнее.


конкретнее мона? смущ

-----

class MyDbRepository

public MyController(ApplicationDbContext context)

readonly не должно инициироваться в методе

#4 
Программист коренной житель12.05.23 05:57
NEW 12.05.23 05:57 
in Antwort AlexNek 11.05.23 20:29
Что выбираем и почему?

Выбираем 1-й вариант, т.к. только он дает гарантию контроля (выспобождения) ресурсов.


Ну и во 2-ом примере у тебя ошибка. Должно быть так:

...application part....
using(ApplicationDbContext  context = GetContextFromFacroty())
{
   IMyDbRepository repo = new MyDbRepository(context);
   repo.Dosomething
}
#5 
AlexNek патриот12.05.23 08:07
AlexNek
NEW 12.05.23 08:07 
in Antwort Программист 12.05.23 05:57
только он дает гарантию контроля (выспобождения) ресурсов

А почему 2й этого не даёт? И как будем тестить "свободу", что получаем в 1м методе


Ну и во 2-ом примере у тебя ошибка. Должно быть так

странно, и для 8й версии?

https://learn.microsoft.com/en-us/dotnet/csharp/language-r...

#6 
AlexNek патриот12.05.23 08:08
AlexNek
NEW 12.05.23 08:08 
in Antwort Murr 11.05.23 23:28
readonly не должно инициироваться в методе

даже и не заметил смущ, просто скопипастил 1 вариант.

#7 
Программист коренной житель12.05.23 08:51
NEW 12.05.23 08:51 
in Antwort AlexNek 12.05.23 08:07
А почему 2й этого не даёт?

Потому что ты не можешь гарантировать и контролировать, что вызывающий тебя код в конце работы вызывает Dispose.


И как будем тестить "свободу", что получаем в 1м методе

В вервом методе освобождение ресурсов под контролем репозитория, освобождение контекста можно протестировать юнит тестом.


странно, и для 8й версии?

Не совсем понимаю, что ты хочешь узнать :)

Создаваемые контекст нужно как-то передать в репозиторий.


Только что заметил, что у класса репозитория нет конструктора. Зато есть какой-то конструктор для класса MyController... Предполагаю, что конструктор должен называться MyDbRepository, а не MyController.

#8 
AlexNek патриот12.05.23 18:19
AlexNek
NEW 12.05.23 18:19 
in Antwort Программист 12.05.23 08:51
вызывает Dispose

Dispose чего - contextFactory?

Так я его не создаю явно DI всё делает за меня


В вервом методе освобождение ресурсов под контролем репозитория

дело не в этом, метод может возвращать IAsyncEnumerable<X> или IQueryable<X> и с результатом можно делать что хошь - Это я и называю свобода.


Не совсем понимаю, что ты хочешь узнать

Будет ли ошибка для 8й версии шарпа?


Предполагаю, что конструктор

Совершенно правильно, но поправить позже 1й пост низзя, а код я совершенно не проверял, меня интересовало только донести идею разницы.

#9 
Программист коренной житель12.05.23 21:46
NEW 12.05.23 21:46 
in Antwort AlexNek 12.05.23 18:19
Dispose чего - contextFactory?
Так я его не создаю явно DI всё делает за меня

Ты берешь context явным образом из фабрики. Посмотри свой код в 1ом посте.


Будет ли ошибка для 8й версии шарпа?

При чем тут версия шарпа?

Посмотри свой код:

public class MyDbRepository: IMyDbRepository
{
    private readonly ApplicationDbContext _context;
    public MyController(ApplicationDbContext context)
    {
        _context = context;
    }
    public void DoSomething()
    {
        {
            // use _context...
        }
    }
}
...application part....
IMyDbRepository repo= 'over DI'; <<-- тут ты получаешь объект типа IMyDbRepository
using(ApplicationDbContext  context = GetContextFromFacroty()) <<-- а тут ты получаешь контекст, который надо передать в конструктор строчкой выше.
{
   repo.Dosomething
}

Очевидно, что такая конструкция не будет работать ни в какой версии шарпа. Или в 8й версии что-то поменяли?смущ

#10 
AlexNek патриот12.05.23 23:06
AlexNek
NEW 12.05.23 23:06 
in Antwort Программист 12.05.23 21:46
Посмотри свой код в 1ом посте.

Да, наконец-то посмотрел. смущ У меня перед глазами код из проекта был, как картинка. Но срисовал неправильно

Там не так должно быть, что то думал что так написано. И это не понравилось, сорри.

using ApplicationDbContext  context = GetContextFromFacroty();


Использование следующее

using(IMyDbRepository repo = CreateRepository()) 
{
   repo.Dosomething();
}
#11 
Murr патриот12.05.23 23:35
Murr
NEW 12.05.23 23:35 
in Antwort AlexNek 12.05.23 18:19

Dispose чего - contextFactory?

------

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

#12 
uscheswoi_82 коренной житель13.05.23 00:10
NEW 13.05.23 00:10 
in Antwort AlexNek 11.05.23 20:29

Спросите у ChatGPT. Из-за этого чата можно работу потерять в будущем, чат умеет хорошо помогать программировать см.:

Пишит сценарий:


Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнении Meine Die Formel der Liebe
#13 
alex445 коренной житель13.05.23 11:05
NEW 13.05.23 11:05 
in Antwort uscheswoi_82 13.05.23 00:10, Zuletzt geändert 13.05.23 11:05 (alex445)
Спросите у ChatGPT. Из-за этого чата можно работу потерять в будущем, чат умеет хорошо помогать программировать см.:

Он умеет тырить куски готового кода, иногда смешивая их до полного неиспользования. И эти игрушки маленькие, которые он выдаёт, это зачастую цельнотянутые проекты с чужих репозиториев. Короче, ничего нового он не придумывает, а лишь копирует и комбинирует уже известное. Причём тупо копировать у него получается на порядок лучше, а если надо скомбинировать, то там всё перепроверять надо, чтобы чушь не вышла. Т.е. даже эта раскрученная херня работает лишь как поисковая машина и плохой джун, который даже куски готового кода не всегда соединить может.

#14 
AlexNek патриот13.05.23 11:12
AlexNek
NEW 13.05.23 11:12 
in Antwort Murr 12.05.23 23:35

ну так и там и там это выполняется

#15 
AlexNek патриот13.05.23 11:16
AlexNek
NEW 13.05.23 11:16 
in Antwort uscheswoi_82 13.05.23 00:10
Спросите у ChatGPT.

И где? Раз попалось без регистрации, но теперь не работает. хммм


Из-за этого чата можно работу потерять в будущем

Конкретный пример работы можно, из сферы программирования?

#16 
alex445 коренной житель13.05.23 14:49
13.05.23 14:49 
in Antwort AlexNek 13.05.23 11:16, Zuletzt geändert 13.05.23 14:52 (alex445)
Из-за этого чата можно работу потерять в будущем
Конкретный пример работы можно, из сферы программирования?

Копипастер. Но сам этот чат в ваш проект ничего вставлять не умеет, и готовых инструментов для внедрения копипасты в ваши проекты тоже нет. Поэтому даже для копипасты пока ещё нужен живой чел.


- За что я плачу тебе 101 тысячу в год?

- 1 тысячу за то, что копипастю, и 100 тысяч за то, что знаю, куда скопипастить.

#17 
AlexNek патриот13.05.23 15:57
AlexNek
NEW 13.05.23 15:57 
in Antwort alex445 13.05.23 14:49
Копипастер.

Пока не встречал исключительно енто. И не могу представить это для нормального проекта.

#18