2013-02-19 77 views
0

這個問題看起來很奇怪,但我們確實有這樣的情況,我們需要修復構造函數簽名。爲什麼沒有辦法在C#中約束構造函數的簽名?

例如,我希望它的解決DI的依賴關係。如果構造函數被擴展並需要更多的參數,其中一些依賴於上下文,我很麻煩。
當然,如果DI容器不能解決依賴關係,那麼它肯定會引發異常,但這並不是我想的最好的方式。

我只是重構我們的應用程序,並明白,最初計劃成爲DI的一個好候選者現在由於故意構造函數擴展而不理解後果而被破壞。阻止它的唯一方法就是開發人員之間的約定。
語言支持將非常有幫助,但C#和Java都沒有。

所以我認爲應該有一些原因,這個功能沒有實現...爲什麼?

這是我們廠的樣子:

public class EntityBase : IEntity 
{ 
    public EntityBase(IBusinessModel model, IAppContext context) 
    { 
    } 
} 

public class DescendatnEntity : EntityBase, IDescendatnEntity 
{ 
    public DescendatnEntity(IBusinessModel model, IAppContext context, ...additional params...) 
    { 
    } 
} 

public interface IEntitiesFactory 
{ 
    IEntity GetBaseEntity(); 
    IDescendantEntity GetDescendantEntity(...those additional params...); 
} 

IBusinessModelIAppContext單身,而另外PARAMS是短暫的。

如果只有調用者知道瞬態參數的值,那麼工廠就不需要知道這些參數。

+0

如果將構造函數排成一行,那麼這些類最終會得到它們的依賴關係? – Jon 2013-02-19 19:34:42

+1

你是什麼意思*固定構造函數簽名*? – 2013-02-19 19:34:42

+2

聽起來像你只需要創建一個工廠類,可以用來創建你的類型。 – Servy 2013-02-19 19:36:19

回答

0

您可以使用構造函數鏈來提供您的默認實現。

public class DescendantEntity : EntityBase, IDescendatnEntity 
{ 

    public DescendantEntity(IBusinessModel model, IAppContext context, ...additional params...) 
    { 
    } 
    public DescendantEntity(IBusinessModel model, IAppContext context) 
     this(model, context, ...additional params defaults...) 
    { 
    } 
} 
+0

我們已經在使用它。問題不在默認實現中。問題是工廠必須知道每個已解決的依賴關係的這些附加參數。 – 2013-02-19 20:19:23

+0

@voroninp如果您不想讓工廠瞭解依賴關係,那麼您可能需要將依賴關係重構爲另一個類。 – Romoku 2013-02-19 20:22:59

+0

我希望工廠瞭解它可以提供給依賴關係的依賴關係。單純的問題是開發人員只是允許構造函數通過添加一些與構建過程無關的參數來進行更改。是的,我將不得不將類重構回相同的構造函數。 – 2013-02-19 20:31:38

相關問題