2017-02-22 87 views
0

我想實現一個工廠,該工廠基於調用的泛型返回一個類。基於通用的工廠混凝土返回類型

我現在有它的工作是這樣的:

public static TRepository GetInstance<T, TRepository>() 
    where TRepository : IRepository<T>, new() 
{ 
    return new TRepository(); 
} 

調用它像這樣:

InvoiceRepository repo = RepositoryFactory.GetInstance<Invoice, InvoiceRepository>(); 

這工作,但我寧願沒有聲明返回類型。我想這樣稱呼它:

InvoiceRepository repo = RepositoryFactory.GetInstance<Invoice>(); 

這不是真的很重要,但它只是困擾我,我如果有任何明顯的解決方案好奇。

+2

哪種類型應該在工廠建設?它應該搜索加載的程序集中實現「IRepository 」接口的類型嗎? –

+0

不知道這是否是一個修辭問題,但是是的,它應該返回IRepository 的實現,因爲它們中只有一個。 e:我仍然是一名學生,很可能我有點遺忘某些可能對其他人顯而易見的事情。 – ihendriks

+0

您可以在工廠中創建一個專用字典('Dictionary '),它映射不同'T'及其相應的存儲庫類型。然後,當您被要求構建存儲庫時,可以使用字典來獲取存儲庫的類型,然後使用反射來構建存儲庫類型。 –

回答

0
public interface IRepository<T> 
{ 
} 

public class Repository<T> : IRepository<T> 
{ 

} 

public static class RepositoryFactory 
{ 
    public static IRepository<T> GetInstance<T>() 
       where T : new() 
    { 
     return new Repository<T>(); 
    } 
} 

然後,調用它像這樣:

var repo = RepositoryFactory.GetInstance<Invoice>(); 
+0

我的實現不使用泛型,我也沒有看到如何實現您的建議。我的impl就是這樣的:'public class InvoiceRepository:IRepository {// ..}'。我不知道這是否有幫助。 – ihendriks