【发布时间】:2023-03-09 08:53:01
【问题描述】:
我按照教程使用 EF Core 构建了一个后端并实现了存储库模式。
首先,我创建了一个存储库接口和一个提供基本 CRUD 方法的存储库基类。然后,我为我需要与这些特定类上的数据交互的任何自定义方法为我的每个实体创建了单独的接口和存储库。
其次,我创建了一个接口和一个名为 IRepositoryWrapper 和 RepositoryWrapper 的具体类。定义要返回的存储库和保存方法,然后是检索存储库的实现和保存更改方法。
最后,我创建了一个控制器并将 IRepositoryWrapper 注入到控制器的构造函数中。
我的问题是:为什么将接口注入控制器实际上有效?既然接口只提供了定义,为什么实际的实现似乎也随之而来呢?我觉得我应该注入具体的 RepositoryWrapper 类。
https://code-maze.com/net-core-web-development-part4/#repository
这可以正常工作,我只是在问一个 OOP 问题。
public interface IRepositoryWrapper
{
IScenarioRepository Scenario { get; }
IConditionRepository Condition { get; }
void Save();
}
public class RepositoryWrapper : IRepositoryWrapper
{
private EvaluatorContext _evaluatorContext;
private IConditionRepository _condition;
private IScenarioRepository _scenario;
public RepositoryWrapper(EvaluatorContext evaluatorContext)
{
this._evaluatorContext = evaluatorContext;
}
public IScenarioRepository Scenario
{
get
{
if (_scenario == null)
{
_scenario = new ScenarioRepository(_evaluatorContext);
}
return _scenario;
}
}
public IConditionRepository Condition
{
get
{
if (_condition == null)
{
_condition = new ConditionRepository(_evaluatorContext);
}
return _condition;
}
}
public void Save()
{
_evaluatorContext.SaveChanges();
}
}
控制器类:
[Route("api/[controller]")]
[ApiController]
public class ScenariosController : ControllerBase
{
private IRepositoryWrapper _repositoryWrapper;
//What I am calling injecting this interface into the constructor
public ScenariosController(IRepositoryWrapper repositoryWrapper)
{
this._repositoryWrapper = repositoryWrapper;
}
[HttpGet]
public IEnumerable<Scenario> FindAll()
{
return this._repositoryWrapper.Scenario.FindAllWithIncludes();
}
}
【问题讨论】:
-
当你说,“为什么将接口注入到控制器中实际上起作用了?”,你指的是哪一行代码?
-
@RufusL 我编辑了这篇文章。我添加了控制器类和一个注释,描述了它在我看来就像一个接口被注入的位置。本来应该这样做的。
-
因为您在容器中注册了
RepositoryWrapper(针对界面)。容器根据定义不能只给你一个实例IRepositoryWrapper(自己试试这个 - 试试newupIRepositoryWrapper)。没有办法实例化一个接口。它需要实例化实现接口的东西。 -
I feel like I should be injecting the concrete class RepositoryWrapper instead.当然你可以做到这一点。单元测试可能会更难,但如果您不想使用接口,则不需要。
标签: c# oop asp.net-core dependency-injection