Metodi statici e modello di gateway di dati di tabella

2

Implemento il gateway dei dati della tabella sul livello di accesso ai dati e lo script delle transazioni per le aziende. È possibile creare un gateway dati di tabella con metodi non statici e quindi creare oggetti DAL in BL per i metodi di gateway delle chiamate?

Adesso lo faccio

var result = myGateway.SelectAll(p1, p2, p3);

con metodi non statici sarebbe

var MyGWObject = new myGateway();
var result = MyGWObject.SelectAll(p1,p2,p3);

in ogni transazione (probabilmente organizzata come una classe e l'oggetto sarebbe la sua variabile privata).

Va bene o male? Ed è anche il secondo approccio quando l'oggetto viene creato più come il Modulo Tabella o solo un pasticcio?

    
posta Bendom 22.02.2017 - 10:06
fonte

1 risposta

2

In primo luogo, il codice è molto difficile da leggere in quanto si ignorano le convenzioni di codifica C #: si ha un nome di classe camelCase e un nome di variabile PascalCase. Quindi, nei miei esempi qui sotto, ho risolto ciò per rendere più semplice la lettura di altre persone che hanno familiarità con le convenzioni in C #.

var result = MyGateway.SelectAll(p1, p2, p3);

Questo è un esempio di antipattern del localizzatore. Poiché MyGateway.SelectAll è statico, non esiste un modo semplice per sostituire l'implementazione effettiva per una più semplice durante il test, ad esempio. Quindi hai ragione a voler migliorare questo.

Tuttavia la tua soluzione proposta, sulla falsariga di:

class SomeClass
{
    private readonly MyGateway _myGateWay = new MyGateway();

    public SelectAllResult SomeMethod()
    {
        ...
        var result = _myGateWay.SelectAll(p1,p2,p3);
        ...
    }
}

non è meglio. Stai ancora accoppiando saldamente la tua classe a MyGateway , rendendo ancora più difficili i test di quanto sia necessario.

Una terza soluzione, che risolve questi problemi, consiste nell'utilizzare un'interfaccia e passare un'istanza di un tipo che la implementa nel costruttore:

class SomeClass
{
    private readonly IGateway _myGateway;

    public SomeClass(IGateway myGateway)
    {
        _myGateway = myGateway;
    }

    public SelectAllResult SomeMethod()
    {
        ...
        var result = _myGateWay.SelectAll(p1,p2,p3);
        ...
    }
}

Questo approccio di dipendenza da dipendenza disaccoppia la tua classe da MyGateway e rende il test molto più semplice.

    
risposta data 22.02.2017 - 15:58
fonte

Leggi altre domande sui tag