C# 按实体类型自动创建存储库
C# automatic creation of repositories by entity type
我找到了一个基于 Entity Framework 的 Generic Repository 示例,并试图了解如何通过相同的接口和实体类型自动解析存储库.
上面的 link 指向 repo,您可以在其中看到以下方法:
public class HomeController : Controller
{
private readonly ICategoryRepository _repository;
public HomeController(ICategoryRepository repository)
{
_repository = repository;
}
在这种情况下,我们必须创建一个单独的 CategoryRepository - 因此,存储库是每个类型。
这意味着我们最终有很多 类 的存储库。
我想远离多个 类 并找到一个解决方法来处理将实体类型作为类型参数传递给接口的存储库
public class HomeController : Controller
{
private readonly IRepository<Category> _repository;
public HomeController(IRepository<Category> repository)
{
_repository = repository;
}
我尝试 google 解决方案,但没有找到太多代码示例。
ASP.NET Boilerplate framework has this functionality as you can see from sources.
我可以看到该文件夹中的界面文件,它们很有意义。
但它们的实现对我来说有点晦涩,因为似乎有一些额外的代码可以处理自动回购创建。
如评论中所述,避免重新发明轮子。如果您正在使用任何完整的 ORM(此处的 Entity Framework),它本身既可以用作存储库,也可以用作 UoW。因此,最推荐使用 ORM 本身内联并绕过 Repository 和 UoW。以下是一些不错的读物:
http://www.primaryobjects.com/2010/03/17/using-the-nhibernate-repository-pattern-in-c-asp-net/
但是,在某些情况下,您可能仍想实施 Repository。这允许您在代码中注入存储库,使代码的其他部分可测试。即使在那种情况下,也要避免使用通用存储库。它被认为是 anti-pattern.
在那种情况下,为每个聚合根实施具体的存储库。避免使用通用存储库,或者将其用作所有具体存储库的基础 class。更多解释可以在 and this and this 答案中找到。
您链接的 GitHub 示例代码看起来是通用基础存储库 class 的良好接口。请注意,它公开了 IQueryable<TEntity> GetAll();
。如果在 base class 中实现,这应该没问题。永远不要从您的具体存储库中 return IQueryable
。它违反了存储库模式的基本目的。
我找到了一个基于 Entity Framework 的 Generic Repository 示例,并试图了解如何通过相同的接口和实体类型自动解析存储库.
上面的 link 指向 repo,您可以在其中看到以下方法:
public class HomeController : Controller
{
private readonly ICategoryRepository _repository;
public HomeController(ICategoryRepository repository)
{
_repository = repository;
}
在这种情况下,我们必须创建一个单独的 CategoryRepository - 因此,存储库是每个类型。
这意味着我们最终有很多 类 的存储库。
我想远离多个 类 并找到一个解决方法来处理将实体类型作为类型参数传递给接口的存储库
public class HomeController : Controller
{
private readonly IRepository<Category> _repository;
public HomeController(IRepository<Category> repository)
{
_repository = repository;
}
我尝试 google 解决方案,但没有找到太多代码示例。
ASP.NET Boilerplate framework has this functionality as you can see from sources.
我可以看到该文件夹中的界面文件,它们很有意义。
但它们的实现对我来说有点晦涩,因为似乎有一些额外的代码可以处理自动回购创建。
如评论中所述,避免重新发明轮子。如果您正在使用任何完整的 ORM(此处的 Entity Framework),它本身既可以用作存储库,也可以用作 UoW。因此,最推荐使用 ORM 本身内联并绕过 Repository 和 UoW。以下是一些不错的读物:
http://www.primaryobjects.com/2010/03/17/using-the-nhibernate-repository-pattern-in-c-asp-net/
但是,在某些情况下,您可能仍想实施 Repository。这允许您在代码中注入存储库,使代码的其他部分可测试。即使在那种情况下,也要避免使用通用存储库。它被认为是 anti-pattern.
在那种情况下,为每个聚合根实施具体的存储库。避免使用通用存储库,或者将其用作所有具体存储库的基础 class。更多解释可以在
您链接的 GitHub 示例代码看起来是通用基础存储库 class 的良好接口。请注意,它公开了 IQueryable<TEntity> GetAll();
。如果在 base class 中实现,这应该没问题。永远不要从您的具体存储库中 return IQueryable
。它违反了存储库模式的基本目的。