2017-01-03 4 views
1

Ich habe mehrere Subsysteme in einem großen System. So hat jedes Subsystem seine eigene BAL- und DAL-Implementierung. Jetzt haben die BAL (s) eine signifikante Logik, aber die DAL hatte im Grunde einen ähnlichen Code, so dass ich sie in eine generische DAL-Klasse umstrukturierte, die jetzt für alle Subsysteme verwendet wird. Etwas wie folgt aus:Refactoring Implementierung von mehreren Klassen mit gemeinsamen Code (mit DI)

Lassen Sie uns Subsystem Namen wie A und B

public class DalA 
{ 
    private IGenericDal genericDal; 

    public DalA(IGenericDal injectedGenericDal) 
    { 
     this.genericDal = injectedGenericDal; 
    } 

    public bool DoSomeDBWorkForA() 
    { 
     return genericDal.CommonDalMethod(); 
    } 
} 


public class DalB 
{ 
    private IGenericDal genericDal; 

    public DalB(IGenericDal injectedGenericDal) 
    { 
     this.genericDal = injectedGenericDal; 
    } 

    public bool DoSomeDBWorkForB() 
    { 
     return genericDal.CommonDalMethod(); 
    } 
} 

Nun ist die DI Teil der Injektion generic DAL ist wichtig, von Unit-Tests Sicht übernehmen, so dass der BAL (n) die injizieren generisches DAL-Objekt. Jetzt ist die BAL unnötigerweise wegen der Refactoring- und DI-Anforderungen, die sie idealerweise nicht sein sollte (insbesondere beim Refactoring), unnötigerweise auf das generische DAL-Objekt aufmerksam.

Auch einer meiner Freunde wies darauf hin, dass die DAL (s) von Subsystem A und B nichts tun, also sollten wir sie wahrscheinlich loswerden und generische DAL selbst nennen, aber meiner Meinung nach reduziert es die Flexibilität als morgen DAL von A könnte eine Protokollierung oder eine andere spezielle Aktion ausführen, die B oder sogar C möglicherweise nicht abonnieren.

Also was denkst du? Hat jemand eine bessere refaktorierte Implementierung, wo der DI, die Trennung von Interessen (d. H. BAL von A kennt nur DAL von A und nicht allgemeines DAL-Objekt) und Flexibilität (mit verschiedenen DAL (s) für alle Subsysteme) intakt sind.

Eine der Möglichkeiten, die ich dachte, war, 2 Konstruktoren in DAL von A und B zu haben, so dass von BAL können wir ohne generische DAL-Injektion aufrufen und von Unit Test kann ich Generic DAL Objekt injizieren.

+2

IMHO, es ist falsch mehrere Teilsysteme innerhalb eines Systems zu haben (Lösung) diejenigen, haben alle Teile eines Systems. Die Verwendung von Micro-Services ist stattdessen eine bessere Idee oder das Ändern von Subsystemen in Module;). –

+0

@ shA.t Das ist ein guter Vorschlag, aber in diesem Fall kann ich mir die erhöhte Latenz aufgrund der Implementierung von Micro Services nicht leisten;) Was würden Sie dann vorschlagen? –

Antwort

1

die DAL (s) von Subsystem A und B tun nichts, also sollten wir sie wahrscheinlich loswerden und generische DAL selbst nennen, aber meiner Meinung nach reduziert es die Flexibilität, wie morgen DAL von A vielleicht etwas tun möchte Protokollierung oder eine andere spezielle Aktion, die B oder sogar C möglicherweise nicht abonnieren.

Klassen sollten open for extension but closed to modification sein. Das bedeutet, dass das Hinzufügen von Protokollierung nicht bedeutet, dass Sie die DAL von A ändern müssen. Sie sollten dies tun können, indem Sie einen Dekorator erstellen, der die generische DAL umschließt. Das Gleiche gilt für andere bereichsübergreifende Anliegen.

So ist diese Flexibilität nicht IMO ein starkes Argument für in die zusätzlichen Schichten Indirektionsebene halten

+0

Sie sagen also das Entfernen der DAL (intermediate DALs) vorerst ist der Weg zu gehen und Modifizierung sollte über Decorator behandelt werden, aber glauben Sie nicht, dass die DAL (s) auf der ganzen Welt selten mit viel Logik so umgehen ein breiterer Sinn sollte DAL (s) nicht immer (oder zumindest oft) so entworfen werden, da die meisten Anwendungen mehrere Module (also mehrere DAL (s)) haben? –

+1

@RachitPandey: Ja, unter Berücksichtigung der gelieferten Informationen, empfehle ich die Entfernung der Zwischenschicht. Ich kann nicht wirklich sagen, wie "DAL (s) around the world" gestaltet sind, da es zu viele Gemeinsamkeiten gibt. – Steven

+0

Ich stimme der Entfernung von Zwischenschichten jetzt zu, aber es wird eine Anomalie geben, an der ich Ihre Gedanken haben möchte. Wenn ich die generische DAL direkt von BAL aus anrufe, muss ich einige "DAL-spezifische Parameter" wie SP-Namen usw. angeben, von denen ich denke, dass BAL sie nicht wirklich beachten sollte. Ich kann diese Parameter auch nicht von generischen DALs entfernen, damit sie generisch bleiben. –

Verwandte Themen