responsabilidad: Me encantaría estar usando dependency injection en este proyecto y tienen un diseño basado en la interfaz de acoplamiento flexible en todos los ámbitos, pero el uso de la dependencia de la inyección ha sido derribado en este proyecto. También los principios de diseño SOLID (y design patterns en general) son algo extraño donde trabajo y soy nuevo en muchos de ellos. Así que tome eso en cuenta al sugerir un mejor diseño para este problema.¿Hay una mejor opción de diseño?
Aquí hay una versión simplificada del código en el que estoy trabajando, y como tal podría parecer artificial. Si es así, me disculpo. Tenga en cuenta las siguientes clases:
// 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);
}
}
decir estas dos clases se utilizan como sigue:
// 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();
Sin embargo ahora encuentro que también necesito para realizar foo.Operation1
en algunas implementaciones de helper.DoSomethingHelpful();
? Las posibles soluciones alternativas que pensé serían:
- Have foo and helper tienen una relación bidireccional. De modo que en DoSomethingHelpful podemos llamar foo.Operation2
- Ha foo implementar la interfaz iHelp y mover el código de "ayudante" en foo
- Uso delegación y aprobar el método de funcionamiento 2 como delegado
Action<string>
en el constructor del ayudante.
Ninguno de estos enfoques parece ser ideal (aunque he más o menos decidido que no me gusta la opción 1 y estoy preocupado por mantenimiento con la opción 3 si descubrimos más tarde que necesitamos para pasar en más delegados). Esto me hace preguntarme si hay un problema con el diseño inicial del combo Helper
/Foo
. ¿Pensamientos?
Creo que quiere decir 'DefaultHelper' en lugar de' DefualtHelper'. – ja72
@ ja72, la ortografía nunca fue mi fuerte, he actualizado este error tipográfico. – Matt
+1 por la exención de responsabilidad ... Se rió mucho. – scottheckel