2011-11-15 23 views
1

我們試圖在DAL上創建某種類型的層,以便使用泛型公開某些存儲庫方法的接口。公開單個類中的不同接口

例如:

public interface A 
{ 
    void Do_A(); 
} 

public interface B 
{ 
    void Do_B(); 
} 

public void Main() 
{ 
    Exposer<A>.Do_A(); 
    Exposer<B>.Do_B(); 
} 

是否有可能做到這一點?

+0

您既未提供完整的樣品也不是一個完整的定義你正在解決的具體問題。那麼你在問什麼? –

+0

某種基於的接口方法暴露的接口方法,如果我不夠清楚 – guyl

回答

2

從技術上講,這不是「單一類」,因爲Exposer<A>是不同的TypeExposer<B>;然而,最終,這不看大多數的IoC/DI容器太大的不同......如果這是,比方說,StructureMap(純粹的例子),你可能會考慮:

container.GetInstance<A>().Do_A(); 
container.GetInstance<B>().Do_B(); 

你會的,當然,需要配置容器以知道具體的實現來自哪裏,具體爲AB!其中適用於StructureMap is shown here,但有plenty to choose from

如果你的意思是直接,那麼:沒有。你不能有:

class Exposer<T> : T {...} // non-working code to implement the interface T 

可以,然而,有一些類:

class Exposer : A, B {...} 

,只是投:

A a = Exposer; 
a.Do_A(); 
B b = Exposer; 
b.Do_B(); 
1

A型Foo<T>無法實現(或擴展)的實際爲T,因爲T在編譯時未知。你可以做的是公開一個T作爲一個屬性,並調用它的方法。但是,正如翁德里所寫,這個問題可能有點不清楚。

1

當你寫作時,你是在描述IoC嗎?

Exposer<A>.Do_A(); 

你的風險器類讓我覺得StructureMap API:

ObjectFactory.GetInstance<T>().Do_A(); 

如果你想擺脫關鍵字new的,並且在一般的方式得到一個實例指定接口,一起來看看至此article或檢查StructureMap

0

要選擇在使用給定類時要使用哪種接口實現,請不要使用泛型,而只需將類轉換爲接口:

public interface A 
{ 
    void Do_A(); 
} 

public interface B 
{ 
    void Do_B(); 
} 

public class Exposer : A, B 
{ 
    public void Do_A() { ; } 
    public void Do_B() { ; } 
} 

public void Main() 
{ 
    // the casts are redundant here, 
    // because the interface implementation 
    // is implicit 

    ((A)Exposer).Do_A(); 
    ((B)Exposer).Do_B(); 
} 

如果你想排除成員是給定接口的成員實現,使用顯式實現:

public class Exposer : A, B 
{ 
    void A.Do_A() { ; } 
    void B.Do_B() { ; } 
} 

public void Main() 
{ 
    // the casts are now required; 
    // otherwise, you'll get a compiler error 
    // telling you that the method is inaccessible 

    ((A)Exposer).Do_A(); 
    ((B)Exposer).Do_B(); 
} 
相關問題