2017-02-22 84 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