Haftungsausschluss: Ich würde gerne dependency injection auf diesem Projekt mit sein und eine lose gekoppelte Interface-basierte Design auf der ganzen Linie, aber die Verwendung von Abhängigkeitsinjektion wurde in diesem Projekt abgeschossen. Auch SOLID Design-Prinzipien (und design patterns im Allgemeinen) sind etwas Fremdes, wo ich arbeite und ich bin neu für viele von ihnen selbst. Also nehmen Sie das in Erwägung, wenn Sie ein besseres Design für dieses Problem vorschlagen.Gibt es eine bessere Designoption?
Hier ist eine vereinfachte Version des Codes, an dem ich arbeite, und als solcher könnte es erfunden scheinen. Wenn das so ist, entschuldige ich mich. Betrachten Sie die folgenden Klassen:
// Foo is a class that wraps underlying functionality from another
// assembly to create a simplified API. Think of this as a service layer class,
// a facade-like wrapper. It contains a helper class that is specific to
// foo. Other AbstractFoo implementations have their own helpers.
public class Foo : AbstractFoo
{
private readonly DefaultHelper helper;
public override DefaultHelper Helper { get { return helper; } }
public Foo()
{
helper = new Helper("custom stuff");
}
public override void Operation1(string value)
{
Console.WriteLine("Operation1 using " + value);
}
public override void Operation2()
{
Console.WriteLine("Operation2");
}
}
// Helper derives from a default implementation and allows us to
// override it's methods to do things specific for the class that
// holds this helper. Sometimes we use a custom helper, sometimes
// we use the default one.
public class Helper : DefaultHelper
{
private readonly string customStuff;
public Helper(string value)
{
customStuff = value;
}
public override void DoSomethingHelpful()
{
Console.WriteLine("I was helpful using " + customStuff);
}
}
sagen, diese zwei Klassen werden wie folgt verwendet:
// foo referenced and used in one part of code
var foo = new Foo();
foo.Operation2(); // or foo.Operation1();
// some other point in the program where we don't have a reference to foo
// but do have a reference to the helper
helper.DoSomethingHelpful();
jedoch nun heraus, dass ich finde, dass ich muß auch ausführen foo.Operation1
in einige Implementierungen von helper.DoSomethingHelpful();
? Mögliche Umgehungslösungen, an die ich dachte, wären:
- Haben foo und Helfer eine bidirektionale Beziehung. So dass in DoSomethingHelpful können wir foo.Operation2
- rufen Haben foo iHelp-Schnittstelle implementieren und die „Helfer“ Code in foo
- Verwenden Delegation bewegen und die Methode Operation2 als
Action<string>
Delegierter in den Konstruktor der Helfer übergeben.
Keiner dieser Ansätze scheinen ideal zu sein (obwohl ich ziemlich festgestellt haben, ich weiß nicht wie Option 1 und mache mir Sorgen um die Wartbarkeit mit Option 3 wenn wir später erfahren wir bestehen müssen in mehr Delegierten). Das lässt mich fragen, ob es ein Problem mit dem ursprünglichen Design der Helper
/Foo
Combo gibt. Gedanken?
Ich denke, du meinst 'DefaultHelper' statt' DefualtHelper'. – ja72
@ ja72, Rechtschreibung war nie mein starker Anzug, ich habe diesen Tippfehler aktualisiert. – Matt
+1 für den Haftungsausschluss ... Hatte ein großes Lachen. – scottheckel