免责声明:我很想在这个项目上使用依赖注入,并且全面采用基于松散耦合接口的设计,但是在这个项目中使用依赖注入已被否决。此外, SOLID设计原则(以及一般的设计模式)在我工作的地方是陌生的,而且我自己对其中的许多人都很陌生。因此,在为这个问题提出更好的设计时要考虑到这一点。
这是我正在处理的代码的简化版本,因此它可能看起来很做作。如果是这样我道歉。考虑以下类:
// 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);
}
}
假设这两个类的使用如下:
// 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();
但是我现在发现我还需要foo.Operation1
在一些实现中执行helper.DoSomethingHelpful();
?我想到的潜在解决方法是:
- 让 foo 和 helper 具有双向关系。所以在 DoSomethingHelpful 我们可以调用 foo.Operation2
- 让 foo 实现 IHelp 接口并将“帮助”代码移动到 foo
- 使用委托并将方法 Operation2 作为
Action<string>
委托传递给 Helper 的构造函数。
这些方法似乎都不是理想的(尽管我几乎已经确定我不喜欢选项 1 ,并且如果我们稍后发现需要传递更多委托,我担心选项 3的可维护性)。Helper
这让我想知道/Foo
组合的初始设计是否有问题。想法?