Phi*_*ler 0 generics collections design-patterns dependency-injection
我现在正试图通过一些IEnumerables使用依赖注入来获得正确的模式.
我想从数据库中返回三种类型的对象:项目,批次和任务.我想创建一个具有以下形式的存储库:
public interface IRepository<T>
{
IEnumerable<T> GetAll();
IEnumerable<T> GetAllActive();
IEnumerable<T> GetItemsByUserName(string UserName);
T GetItemById(int ID);
}
Run Code Online (Sandbox Code Playgroud)
因此,当我创建ProjectRepository的具体实现时,它将如下所示:
IEnumerable<Project> GetAll();
IEnumerable<Project> GetAllActive();
IEnumerable<Project> GetItemsByUserName(string UserName);
Project GetItemById(int ID);
Run Code Online (Sandbox Code Playgroud)
对于任务类似:
IEnumerable<Task> GetAll();
IEnumerable<Task> GetAllActive();
IEnumerable<Task> GetItemsByUserName(string UserName);
Task GetItemById(int ID);
Run Code Online (Sandbox Code Playgroud)
我的困难在于尝试在我的调用代码中声明一个IRepository.当我声明引用时,我发现自己需要声明一个类型:
private IRepository<Project> Repository;
Run Code Online (Sandbox Code Playgroud)
......这当然毫无意义.我在某个地方出错了,但此刻无法理解.如何使用依赖注入,以便我可以声明一个使用所有三种具体类型的接口?
希望我已经正确地解释了自己.
使用泛型:
public class YourClass<T>
{
public YourClass(IRepository<T> repository)
{
var all = repository.GetAll();
}
}
Run Code Online (Sandbox Code Playgroud)
当然,在某些时候你需要提供T,可能看起来像这样:
var projectClass = yourDIContainer.Resolve<YourClass<Project>>;
Run Code Online (Sandbox Code Playgroud)
在使用DI容器注册类型方面,如果您的DI容器支持开放式泛型,则可能很有用.例如,查看这篇文章,了解Unity如何支持这一点.