Migliore design dell'applicazione - dove posizionare le interfacce

1

Dove posizionare le interfacce in una tipica applicazione a più livelli con DataAccess, BusinessLogic e un modulo Endpoint? Propongo 2 opzioni

In entrambi i casi c'è solo dipendenza dalle astrazioni, ma in primo luogo poniamo le interfacce nello stesso modulo con l'implementazione, in secondo - spostiamo tutte le interfacce nel modulo separato.

Ho questi pro e contro:

Primo approccio

  • più stupido-semplice (perché abbiamo bisogno di questo modulo aggiuntivo? è troppo complicato ecc.)

Secondo approccio

  • più TDD-friendly in quanto ci consente di separarci completamente dal modulo che implementa il contratto quando lo prendiamo in giro.
  • più DI friendly - possiamo riuscire a completare l'isolamento dei moduli.

Tuttavia, la seconda opzione comporta un sovraccarico maggiore e richiede uno sforzo maggiore durante lo sviluppo.

Quindi la mia domanda è: quale approccio è generalmente migliore (o ci sono altre opzioni più appropriate)?

    
posta Konstantin Chernov 05.09.2015 - 09:20
fonte

2 risposte

2

La pratica comune che ho visto in molti progetti è quella di archiviare interfacce e strutture dati associate in un progetto separato, in cui tutti gli altri progetti possono farvi riferimento.

La ragione è che quando si implementano le interfacce è possibile utilizzare qualsiasi interfaccia senza riferimenti preoccupanti, perché se si può fare riferimento all'interfaccia, è sempre possibile utilizzarla con DI, nell'eseguibile reale.

    
risposta data 07.09.2015 - 15:03
fonte
1

In questi giorni, ho utilizzato la seguente struttura e finora ha funzionato molto bene:

Mostra un sistema client / server fittizio con 3 funzioni o moduli di applicazione chiamati Foo, Bar e Baz. Gli utenti possono accedere al sistema tramite una riga di comando, un'interfaccia utente o un'interfaccia basata sul Web.

Questo tipo di struttura è molto TDD e DI friendly nella mia esperienza.

Features

    Assembly: Contoso.Features.FooFeature
        Folder: Contracts                               contains interfaces unique to "FooFeature"; is available at both client and server ends
        Folder: Models                                  contains models unique to "FooFeature"; is available at both client and server ends
        Folder: Services                                contains services unique to "FooFeature"; is available at both client and server ends
        References:
            * Contoso
    Assembly: Contoso.Features.FooFeature.Services      contains services unique to "FooFeature"; is available only at server end
        References:
            * Contoso
            * Contoso.Features.FooFeature
    Assembly: Contoso.Features.FooFeature.Tests
        Folder: Models                                  contains tests for models unique to "FooFeature"
        Folder: Services                                contains tests for services unique to "FooFeature"
        References:
            * Contoso
            * Contoso.Features.FooFeature
            * Contoso.Features.FooFeature.Services

    Assembly: Contoso.Features.BarFeature
        Folder: Contracts                               contains interfaces unique to "BarFeature"; is available at both client and server ends
        Folder: Models                                  contains models unique to "BarFeature"; is available at both client and server ends
        Folder: Services                                contains services unique to "BarFeature"; is available at both client and server ends
        References:
            * Contoso
    Assembly: Contoso.Features.BarFeature.Services      contains services unique to "BarFeature"; is available only at server end
        References:
            * Contoso
            * Contoso.Features.BarFeature
    Assembly: Contoso.Features.BarFeature.Tests
        Folder: Models                                  contains tests for models unique to "BarFeature"
        Folder: Services                                contains tests for services unique to "BarFeature"
        References:
            * Contoso
            * Contoso.Features.BarFeature
            * Contoso.Features.BarFeature.Services

    Assembly: Contoso.Features.BazFeature
        Folder: Contracts                               contains interfaces unique to "BazFeature"; is available at both client and server ends
        Folder: Models                                  contains models unique to "BazFeature"; is available at both client and server ends
        Folder: Services                                contains services unique to "BazFeature"; is available at both client and server ends
        References:
            * Contoso
    Assembly: Contoso.Features.BazFeature.Services      contains services unique to "BazFeature"; is available only at server end
        References:
            * Contoso
            * Contoso.Features.BazFeature
    Assembly: Contoso.Features.BazFeature.Tests
        Folder: Models                                  contains tests for models unique to "BazFeature"
        Folder: Services                                contains tests for services unique to "BazFeature"
        References:
            * Contoso
            * Contoso.Features.BazFeature
            * Contoso.Features.BazFeature.Services

Apps

    Clients
        Assembly: Contoso.CmdApp                        is the command line application client
            References:
                * Contoso
                * Contoso.Features.FooFeature
                * Contoso.Features.BarFeature
                * Contoso.Features.BazFeature
        Assembly: Contoso.WinApp                        is the Windows application client
            References:
                * Contoso
                * Contoso.Features.FooFeature
                * Contoso.Features.BarFeature
                * Contoso.Features.BazFeature
        Assembly: Contoso.WebApp                        is the Web application client
            References:
                * Contoso
                * Contoso.Features.FooFeature
                * Contoso.Features.BarFeature
                * Contoso.Features.BazFeature

    Servers
        Assembly: Contoso.WebSvcApp                     is the Web application server; exposes services via REST or WCF, etc.
            References:
                * Contoso
                * Contoso.Features.FooFeature
                * Contoso.Features.FooFeature.Services
                * Contoso.Features.BarFeature
                * Contoso.Features.BarFeature.Services
                * Contoso.Features.BazFeature
                * Contoso.Features.BazFeature.Services

Core
    Assembly: Contoso
        Folder: Contracts                               contains interfaces common to the entire system
        Folder: Models                                  contains models common to the entire system
        Folder: Services                                contains services common to the entire system
        References:
            * None
    Assembly: Contoso.Tests
        Folder: Models                                  contains tests for models common to the entire system
        Folder: Services                                contains tests for services common to the entire system
        References:
            * Contoso
    
risposta data 05.09.2015 - 18:01
fonte

Leggi altre domande sui tag