Pracuję nad aplikacją konsoli C# i używam struktury encji 5.0 jako warstwy dostępu do danych z serwerem sql. teraz chcę śledzić zmiany i zapisywać je w tabeli dziennika. tak robić, więc jestem inicjowanie 2 DbContext obiektów jeden dla danych biznesowych, podczas gdy drugi dla danych dziennika, jak następuje:Inicjowanie 2 obiektów DBContext jeden dla dzienników, a drugi dla danych biznesowych wewnątrz aplikacji konsoli C#
class Sync
{
static void Main(string[] args)
{
string syncResult = "Sync started";
Entities entities = new Entities();//for business data
Entities entities2 = new Entities();//for logs
try
{
//code goes here
entities.SaveChanges();
}
catch (Exception e)
{
syncResult = string.IsNullOrEmpty(e.Message) ? "Error" : e.Message;
}
entities.Dispose();
entities2.LogHistories.Add(new LogHistory() { Description = syncResult });
entities2.SaveChanges();
entities2.Dispose();
teraz przewidzianego oddzielne obiekty DbContext dla moich dzienników, z następującego powodu/s: -
- jeśli mój pierwszy obiekt podmiot nie jest w stanie zapisać zmiany, z jakiegokolwiek powodu, takich jak nieobsługiwany błędu walidacji, lub próbuje włamać się do systemu, itd .. potem drugi entities2 nadal będzie w stanie uratować wpis do dziennika. weźmy ten przykład. powiedzmy, że integruję się z trzecią częścią API i oczekuję, że zwrócą JSON w określonym formacie. Teraz załóżmy, że zwracany obiekt Json miał brakujące dane, w tym przypadku, gdy próbuję dodać obiekt, który on podniesie i wyjdzie ... teraz, ponieważ mam oddzielny obiekt obiektu dla dzienników, wówczas zapis w dzienniku zostanie zapisany (nie będzie to miało wpływu na wyjątek danych biznesowych). ale gdybym miał jeden obiekt DBContext, to zapis w dzienniku nie może zapisać, ponieważ nie mogę zapisać danych biznesowych. Tak więc moje pytanie brzmi: jeśli zainicjuję 2 obiekty DBContext jeden dla dzienników, a drugi dla danych biznesowych prawidłowe podejście do podążasz za nią, czy też jest to zła decyzja?
Wystarczy przenieść do innego sposobu rejestrowania (Log (opis string)), utworzyć tam nowy kontekst (nie wcześniej jak go stworzyć w swoim przykładzie - dlaczego?) i gotowe. Oczywiście rejestrowanie zwykle nie odbywa się w ten sposób, ponieważ jeśli zapisujesz dzienniki w bazie danych, która powinna być przynajmniej asynchroniczna i umieszczona w kolejce, aby nie spowalniały twoich głównych operacji, to już inna historia. – Evk
@Evk, więc jeśli przeniesię logikę logowania do oddzielnej klasy/metody, to będzie to poprawne podejście, ale posiadanie 2 klas DBContext w głównej metodzie jest problemem !! –
Cóż, to nie jest "problem". Posiadanie całego kodu wśród innych logiki jest po prostu kiepską praktyką, więc przynajmniej przeniesienie go do innej metody sprawi, że kod będzie bardziej czytelny i łatwiejszy w utrzymaniu. Ale będzie jeszcze lepiej, jeśli przeniesiesz przetwarzanie dziennika do innej klasy, która uruchamia oddzielny wątek i ma kolejkę z oczekującymi komunikatami. Następnie wstawia logi jeden po drugim do bazy danych, ponawiając próbę, jeśli połączenie jest z jakiegoś powodu utracone, i najważniejsze, że robi to synchronicznie, niezależnie od twojego innego kodu. Więc masz błąd, umieszczasz to w kolejce i nadal wykonujesz pożyteczną pracę. – Evk