Le librerie di classi .NET Core dovrebbero registrare le proprie implementazioni?

2

Il nostro team ha recentemente avuto una grande difficoltà nel decidere se sia una buona pratica o meno per le librerie di classi .NET Core registrare le proprie implementazioni con il fatto di fornire un metodo di estensione IServiceCollection come AddMyServices ().

Il mio punto era che è bello farlo perché:

  • L'applicazione di primo livello non ha bisogno di conoscere tutti i dettagli del libreria sottostante che verrà utilizzata,
  • L'applicazione di livello superiore (in genere la classe di avvio) non è inquinata con riferimenti a tutti gli spazi dei nomi necessari per registrare la sua implementazione.
  • Se applicazione di livello superiore vuole fornire la propria implementazione personalizzata di alcune interfacce definito nella libreria di riferimento, può ancora farlo. .NET Core l'iniezione di dipendenza consente registrazioni multiple.
  • Se ci sono più applicazioni che fanno riferimento a questa libreria di classi, non è necessario copiare incollare un blocco di ad es. Aggiungi linee di transito a ciascuna applicazione.

I contrasti erano i seguenti:

  • Alcune applicazioni di esempio usano l'approccio di registrare tutto il implementazioni nel metodo di avvio di primo livello.
  • L'approccio sopra riportato viene utilizzato solo per le funzionalità (ma crea dubbi semantici su ciò che può essere definito una funzione e cosa no). Ancora una biblioteca di classe può nominare funzionalità implementa e fornisce metodi AddFeatureXYZ () distinti nella classe di estensione IServiceCollection.
  • L'utilizzo del metodo di estensione AddService () che registra tutte le implementazioni che può fornire può avere un impatto sulle prestazioni del contenitore DI, il che rende senso nel caso in cui alcune librerie di classi forniscono molte impementazioni ma solo pochi sono usati. Ma uno sviluppatore ha ancora una libertà di chiamando AddServices () o no.

Volevo chiedere agli sviluppatori .NET Core più esperti i loro approcci con tutti i professionisti, che forse mi mancano. Se ci sono argomenti validi per utilizzare il secondo approccio che non ho elencato qui, mi piacerebbe davvero conoscerlo.

PS. Questa domanda è stata spostata da StackOverflow in quanto è stata contrassegnata come più basata sull'opinione pubblica. Secondo me sta toccando i principi fondamentali della programmazione orientata agli oggetti, e la questione non è scoprire quale sia la maggioranza degli sviluppatori che sceglie, ma perché qualcuno preferisce un approccio all'altro.

Grazie, Radek

    
posta Radek Strugalski 29.11.2018 - 11:25
fonte

1 risposta

1

I documenti core ASP.Net lo raccomandano

Each services.Add{SERVICE_NAME} extension method adds (and potentially configures) services. For example, services.AddMvc() adds the services Razor Pages and MVC require. We recommended that apps follow this convention. Place extension methods in the Microsoft.Extensions.DependencyInjection namespace to encapsulate groups of service registrations.

Ma io no.

Una delle cose più fastidiose della configurazione dei plugin è cercare di indovinare il metodo di estensione da utilizzare per configurarle. O dovrei dire, la versione che hai di loro come il nome sembra cambiare tra versioni e framework

In secondo luogo, spesso questi metodi di registrazione arrotolati non espongono tutte le cose che potresti voler sovrascrivere o configurare sui servizi sottostanti. L'intero punto del gestore servizi è così che puoi sostituire le dipendenze quando richiesto, ma il metodo di estensione che lo fa per te può impedirlo.

Ma forse la cosa più importante, non penso che questa convenzione abbia preso ancora piede. Sembrano esserci alcune filosofie in competizione quando si tratta di startup.cs e program.cs. Se supporti solo un metodo, sarai sul lato sbagliato di qualcuno.

Fornirei il metodo di estensione, ma in un pacchetto opzionale separato. Consenti agli utenti di registrare manualmente i componenti se lo desiderano oppure utilizzare il metodo di estensione per un'impostazione predefinita.

    
risposta data 29.11.2018 - 12:43
fonte