ich ziemlich neu bin auf all dies, so ist dies wahrscheinlich OOP 101, aber ich kann meinen Kopf nicht drum herum kommen, gelten folgende Voraussetzungen C# -Code lebt in einer Baugruppe:Objekte erstellen, ohne Verkapselung zu brechen
internal interface IDataStore
{
void Store(string name, object data);
object Retrieve(string name);
}
internal class DBStore : IDataStore
{
public DBStore(string connection) { }
public void Store(string name, object data) { }
public object Retrieve(string name) { }
}
public class GizmoManager
{
public GizmoManager(IDataStore dataStore) { }
// Other stuff
}
public class WidgetManager
{
public WidgetManager(IDataStore dataStore) { }
// Other stuff
}
Wenn eine zweite Assembly versucht, einen GizmoManager und einen WidgetManager zu erstellen, kann sie dies nicht tun, da sie keinen DBStore erreichen kann (da sie intern nicht öffentlich ist).
Die folgenden nicht AFAICS arbeiten:
- DBStore und IDataStore öffentlich machen. Schlecht, weil die Client-Assembly dann GizmoManager/WidgetManager umgehen und auf die Datenbank zugreifen kann, wie sie möchte.
- Geben Sie keinen IDataStore an die Konstruktoren GizmoManager und WidgetManager weiter. Schlecht, weil es die Testbarkeit verringert (Sie können einen MockDataStore nicht einfach weitergeben).
- Machen Sie etwas Magie mit Fabriken. Scheint nichts zu lösen, da Sie denselben IDataStore sowohl an GizmoManager als auch an WidgetManager übergeben müssen und die Client-Assembly daher immer noch einen IDataStore einer Variablen zuweisen muss (was nicht möglich ist, da IDataStore intern ist).
Dies ist wahrscheinlich erstaunlich offensichtlich, aber ich kann es einfach nicht sehen. Wie würde man diesen Widerspruch überwinden?
TIA.