Entity Framework: estensione dei servizi di iniezione OR nel contesto DB

1

Temo di porre una domanda un po 'sciocca, ma ora sono completamente perso su quale principio dovrei seguire.

Per quanto ne so - in termini di principio di responsabilità singola è meglio non modificare OPPURE inserire servizi in OPPURE introdurre campi extra in Contesto DB.

Semplicemente perché lo scopo del DB Context è di fornire accesso al database .

The single responsibility principle is a computer programming principle that states that every module or class should have responsibility over a single part of the functionality provided by the software, and that responsibility should be entirely encapsulated by the class. All its services should be narrowly aligned with that responsibility. Robert C. Martin expresses the principle as, "A class should have only one reason to change."

Il motivo per cui sto postando questo - sto cercando di rifattare il codice del Service Layer e vorrei che la mia app impostasse alcuni campi automaticamente (es. CreatorUserId , ModifierUserId , DeleterUserId ) piuttosto di impostare manualmente tutti loro ogni volta - per maggiori informazioni controlla questo .

Se guardi la risposta la persona dice

UserId and TenantId here are just pieces of data that your repository service (here a DbContext) needs. If a service needs data, it should be injected into the service.

anche uno dei commenti

Giving your DbContext open access to the session state or the Http context is clearly wrong. But having your DbContext depend on a small number of fixed parameters is fine. Both the UserId and the TenantId might be necessary to connect to the correct database using the correct identity and record audit data. All well within the single responsibility of the repository.

Ma ho ricevuto anche feedback diversi da un'altra persona in questo post .

Ecco la risposta

You should really think about whether your database context having a dependency on your tenant provider is the right thing to do. As per SRP, your database should only do a single thing and that is provide database access.

Depending on how your tenant provider affects your database access, it might make more sense to move this dependency up one level into some service that uses both the database context and the tenant provider to query data in the right way.

Le opinioni sembrano essere diverse. Qualcuno ha qualche consiglio?

    
posta Alex Herman 01.09.2018 - 18:36
fonte

1 risposta

1

Quello che stai cercando di fare, ereditare DBContext e aggiungere funzionalità di registrazione aggiuntive con metodi sovrascritti è architettonicamente corretto, ma inusuale e potenzialmente troppo complesso, semplicemente perché è DBContext piuttosto che una delle tue classi.

Non consiglierei a nessuno di provare a implementare il proprio DBContext semplicemente perché avresti bisogno di una profonda comprensione di come funzioni la classe per poter aggiungere correttamente la tua logica.

Ad esempio, potresti sovrascrivere SaveChangesAsync (), ma non SaveChanges ()

Sarebbe molto più semplice racchiudere le chiamate DBContext in un livello di repository, ad esempio, e inserire la funzionalità di controllo in quella posizione.

Penso che questo sia il motivo per cui stai ricevendo consigli diversi. Se sei sicuro della tua comprensione di DBContext, vai avanti e sottocategia, iniettando il tuo UserContext e chiamalo DBContextWithUserAuditing

Se non si vuole comprendere il funzionamento di DBContext, quindi iniettarne uno standard, insieme a UserContext in RepositoryWithUserAuditing

    
risposta data 02.09.2018 - 09:37
fonte