1

我已經實現了一個接口IService,該接口繼承了一系列其他接口的功能,並作爲許多不同服務的共同點。通過接口擴展功能

每個服務是由一個接口描述,例如:

public interface IServiceOne : IService 
{ 
    //... 
} 

public class ServiceOne : IServiceOne 
{ 
    //... 
} 

一切到這一點,按預期工作:

IServiceOne serviceOne = new ServiceOne(); 
IServiceTwo serviceTwo = new ServiceTwo(); 

我現在要做的是增加一個大的常量列表(公共變量)到這些服務中的每一個,然而根據服務類型會有所不同(例如,IServiceOne將具有不同於IServiceTwo的常量,將會有IServiceOne中的常量不會存在於IServiceTwo等)。

我想要實現的是類似的東西:

IServiceOne serviceOne = new ServiceOne(); 
var someConstantValue = serviceOne.Const.SomeConstant; 

只是因爲變量將不同業務類型的我決定實現他們每個人一個額外的接口:

public interface IServiceOneConstants 
{ 
    //... 
} 

然後拓寬了我的IService定義:

public interface IServiceOne : IService, IServiceOneConstants 
{ 
    //... 
} 

public class ServiceOne : IServiceOne 
{ 
    //... 
} 

親我現在的瑕疵是我不知道如何執行IServiceOneConstants的具體類。很顯然,當它的一個變量(我們稱之爲常量在這裏)將被稱爲它必須被實例化,所以最初我雖然是一個static類,但是然後你不能通過接口暴露static類的功能。然後我試着用singleton做到這一點,並公開通過公共非靜態包裝其instance

public class Singleton : IServiceOneConstants 
{ 
    private static Singleton _instance; 

    private Singleton() 
    { 
     SomeConstant = "Some value"; 
    } 

    public static Singleton Instance 
    { 
     get 
     { 
      if (_instance == null) 
      { 
       _instance = new Singleton(); 
      } 
      return _instance; 
     } 
    } 

    public String SomeConstant { get; set; } 

    public Singleton Const 
    { 
     get 
     { 
      return Instance; 
     } 
    } 
} 

然後我調整了IServiceOneConstants這樣的:

public interface IServiceOneConstants 
{ 
    Singleton Const { get; } 
} 

,但是當我把這個:

IServiceOne serviceOne = new ServiceOne(); 
var someConstantValue = serviceOne.Const.SomeConstant; 

我得到一個null reference例外,因爲.Const爲空。

我在這裏錯過了什麼?

+0

爲什麼你想使用的接口類型混凝土IMPL拉常數? –

+0

@cottsak我只能調用具體實現作爲它的超級接口類型,因爲我需要這個超級接口派生出來的接口的功能,最重要的是我需要爲這個超級接口添加一些額外的功能,這是不同的根據每種具體類型的基礎類型。 –

+0

在這裏使用抽象類而不是接口可能更合適。 –

回答

1

你真的幫自己弄糊塗越好,通過命名不同的東西相同的名稱;)

所以,先... 你試圖做的是通過實例屬性來訪問單個實例:

public Singleton Const 
    { 
     get 
     { 
      return Instance; 
     } 
    } 

,那麼你正在使用它喜歡:

serviceOne.Const 

,但該變量從未分配。爲了分配它,您應該創建一個Singleton類的實例,將其分配給serviceOne.Const屬性,然後您可以使用它。

你需要的可能是這樣的:

public class ServiceOne : IServiceOne 
{ 
    public Singleton Const 
    { 
     get 
     { 
     return Singleton.Instance; 
     } 
    } 
} 
+0

我不得不把這個單身人員放在一個包裝類裏面,這樣可以工作,但是它很管用!謝謝! –

0

您需要檢查單身人士是否已在ServiceOne.Const.SomeConstant s吸氣器中實例化。如果不是,你需要實例化它。然後返回常量的值。

+0

在哪些特定部分的代碼中,我必須實例化它?這是我似乎並沒有得到的東西之一:( –