免責聲明:我喜歡這個 項目中使用dependency injection,並有全線鬆耦合基於接口的設計,但使用依賴注入已經在這個項目中被擊落。另外SOLID設計原則(和一般design patterns)是我工作的外國事物,我自己對他們中的許多人都是新手。因此,在爲此問題提出更好的設計時,請考慮 。有更好的設計選擇嗎?
下面是我正在處理的代碼的簡化版本,因此它可能看起來有點麻煩。如果是的話,我表示歉意。考慮下面的類:
// 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和助手有雙向關係。因此,在DoSomethingHelpful我們可以稱之爲foo.Operation2
- 有富實現IHelp界面和移動「幫手」的代碼到富
- 使用授權,並通過該方法操作2爲
Action<string>
委派到助手的構造函數。
這些方法都沒有似乎是理想的(雖然我非常確定我不喜歡選項1和很擔心可維護性與選項3如果我們發現以後,我們需要通過在更多的代表)。這讓我想知道Helper
/Foo
組合的初始設計是否有問題。思考?
我想你的意思是'DefaultHelper'而不是'DefualtHelper'。 – ja72 2012-04-04 14:35:15
@ ja72,拼寫從來不是我的強項,我更新了這個錯字。 – Matt 2012-04-04 14:37:46
+1免責聲明...有一個偉大的笑聲。 – scottheckel 2012-04-04 14:39:57