2012-05-11 29 views
0

我有我的存儲庫設置如下。使用通用接口存儲庫

interface IRepository<T> where T : DataRow 
{ 
    T Get(int key); 
} 

interface ICartonRepository : IRepository<CartonDataRow> 
{ 

} 

class CartonRepository : ICartonRepository 
{ 
    public CartonDataRow Get(int key) 
    { 

    } 
} 

我也有一個PackRepository,它的定義方式與CartonRepository相同。我想要做的是類似於以下內容。

IRepository<DataRow> repository; 
switch (rowType) 
{ 
    case Carton: 
    repository = new CartonRepository(); 
    break; 
    case Pack: 
    repository = new PackRepository(); 
    break; 
} 

有沒有辦法實現這個目標?

+0

只要您有一個確定具體存儲庫如何映射到您所提供的'rowType'的有效方法,理論上就完美無瑕。有沒有什麼具體的不工作? –

+2

不知道我理解的意圖 - 如果您將存儲庫聲明爲IRepository ,那麼對其Get方法的調用將返回一個編譯類型的DataRow,而不是它的一個子類。在這種情況下,您可能只需從IRepository中刪除泛型並將其返回DataRow :) –

回答

0

對於C#3.5,你將不得不增加以下內容:

public interface IRepository { 
    DataRow Get(int key); 
} 

public abstract class Repository<T> : IRepository<T>, IRepository 
    where T : DataRow 
{ 
    public abstract T Get(int key); 

    DataRow IRepository.Get(int key) { 
     return this.Get(key); 
    } 
} 

然後將CartonRepository更改爲class CartonRepository : Repository<CartonDataRow>(我不認爲你需要ICartonRepository,但你可以使用它,如果你想)。然後

IRepository repository; 
switch (rowType) 
{ 
    case Carton: 
    repository = new CartonRepository(); 
    break; 
    case Pack: 
    repository = new PackRepository(); 
    break; 
} 
0
interface IRepository<out T> where T : DataRow 
{ 
    T Get(int key); 
} 

雖然這需要C#4.0。

+0

是否有3.5解決方案? – JKF

+0

這個需要.NET4.0的唯一部分是聲明類型參數'T'作爲協變的'out'參數。對於創建通用存儲庫實現的解決方案而言,這不是必需的。 –

0

您需要某種Factory pattern

以下邏輯應該去工廠類

class RepositoryFactory 
{ 
    IRepository<T> Get(rowType) 
    { 
     IRepository<T> repository = default(IRepository<T>); 
     switch (rowType) 
     { 
     case Carton: 
      repository = new CartonRepository(); 
      break; 
     case Pack: 
      repository = new PackRepository(); 
      break; 
     } 

     return repository; 
    } 
} 

可以進一步提高GET方法使用Dependency Injection或基於維護所有存儲庫中dictionary.

+0

+1僅適用於工廠模式=>非常有用的知識,許多學校不提及它 – 2012-05-11 03:31:53