为什么看起来该接口提供了实现?

瓦伦

我遵循了一个教程,并使用EF Core构建了后端,并实现了存储库模式。

首先,我创建了一个Repository接口和一个提供基本CRUD方法的Repository Base类。然后,我为与这些特定类上的数据进行交互所需的任何自定义方法,为我的每个实体创建了单独的接口和存储库。

其次,我创建了一个接口和一个名为IRepositoryWrapper和RepositoryWrapper的具体类。定义要返回的存储库和save方法,然后实现检索存储库和save changes方法的实现。

最后,我创建了一个控制器,并将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();
        }

    }

杰里米·汤普森

为什么将接口注入控制器实际上有效?由于接口仅提供定义,所以为什么实际实现似乎附带了定义? 

该接口定义了签名,因此可以以多种方式实现。

当您将带有具体实现的类传递给Controller Constructors Interface参数时,如果该类继承该接口,它将知道所有方法均可用。这就是它所知道的方式。

 我觉得我应该注入具体的类RepositoryWrapper。

没错,当您连接DI时,您便将类与实现挂钩。Interface参数将接受实现接口方法的任何类。

为什么?要点是关注点分离。使用接口使您可以模拟实施,这些显着简化了单元测试。

它们还具有灵活性,例如在美国,税号是11位,在澳大利亚是8位。好吧,您可以为美国提供11位功能,为Oz提供8位功能的课程。如果没有接口,则只能传入11或8-可能会迫使您拥有两个以相同方式操作且行为稍有不同的类。使用接口可为您提供实现的灵活性。

它是SOLID原则,接口隔离原则:低耦合,高内聚和依赖反转原则的一部分,抽象不应依赖细节。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么按钮看起来很奇怪?

来自分类Dev

为什么输出看起来不同?

来自分类Dev

为什么按钮看起来很奇怪?

来自分类Dev

为什么该联合中的结构看起来向后排序

来自分类Dev

为什么我的滚动条看起来很古怪?

来自分类Dev

为什么我的Xubuntu LibreOffice看起来很难看?

来自分类Dev

为什么我的漏斗看起来像这样?

来自分类Dev

为什么我的WinForms控件看起来平坦?

来自分类Dev

为什么水在Unity中看起来是紫色的?

来自分类Dev

为什么这些TShapes看起来如此不同?

来自分类Dev

为什么我的Xubuntu LibreOffice看起来很难看?

来自分类Dev

为什么我的滚动条看起来很古怪?

来自分类Dev

为什么字体在Adobe Acrobat中看起来混乱了?

来自分类Dev

为什么Chrome上的字体看起来很奇怪?

来自分类Dev

为什么终端属性与终端外部看起来不同?

来自分类Dev

为什么我的抽屉菜单看起来是黑色的?

来自分类Dev

为什么CPU内部看起来是彩色的?

来自分类Dev

为什么Gnome应用看起来很奇怪

来自分类Dev

为什么列表在android listview中看起来很奇怪?

来自分类Dev

为什么我的字体看起来不同?

来自分类Dev

为什么我的TreeView看起来像这样?

来自分类Dev

为什么我的谷歌图表看起来不对

来自分类Dev

为什么CocoaPods的Acknowledgements.plist在iOS 9上看起来混乱了,您该怎么办?

来自分类Dev

为什么我的提交历史记录看起来像这样,我该如何解决呢?

来自分类Dev

为什么看起来似乎没用,为什么要使用“ __declspec(dllimport)”?

来自分类Dev

为什么看起来似乎没用,为什么要使用“ __declspec(dllimport)”?

来自分类Dev

在postgresql表分区中的表看起来像什么?我该如何调查?

来自分类Dev

有什么办法可以使该节点js看起来更紧凑?

来自分类Dev

当我从“随机森林”得出的混淆矩阵显示该模型不能很好地预测疾病时,为什么我的ROC图和AUC值看起来不错?

Related 相关文章

  1. 1

    为什么按钮看起来很奇怪?

  2. 2

    为什么输出看起来不同?

  3. 3

    为什么按钮看起来很奇怪?

  4. 4

    为什么该联合中的结构看起来向后排序

  5. 5

    为什么我的滚动条看起来很古怪?

  6. 6

    为什么我的Xubuntu LibreOffice看起来很难看?

  7. 7

    为什么我的漏斗看起来像这样?

  8. 8

    为什么我的WinForms控件看起来平坦?

  9. 9

    为什么水在Unity中看起来是紫色的?

  10. 10

    为什么这些TShapes看起来如此不同?

  11. 11

    为什么我的Xubuntu LibreOffice看起来很难看?

  12. 12

    为什么我的滚动条看起来很古怪?

  13. 13

    为什么字体在Adobe Acrobat中看起来混乱了?

  14. 14

    为什么Chrome上的字体看起来很奇怪?

  15. 15

    为什么终端属性与终端外部看起来不同?

  16. 16

    为什么我的抽屉菜单看起来是黑色的?

  17. 17

    为什么CPU内部看起来是彩色的?

  18. 18

    为什么Gnome应用看起来很奇怪

  19. 19

    为什么列表在android listview中看起来很奇怪?

  20. 20

    为什么我的字体看起来不同?

  21. 21

    为什么我的TreeView看起来像这样?

  22. 22

    为什么我的谷歌图表看起来不对

  23. 23

    为什么CocoaPods的Acknowledgements.plist在iOS 9上看起来混乱了,您该怎么办?

  24. 24

    为什么我的提交历史记录看起来像这样,我该如何解决呢?

  25. 25

    为什么看起来似乎没用,为什么要使用“ __declspec(dllimport)”?

  26. 26

    为什么看起来似乎没用,为什么要使用“ __declspec(dllimport)”?

  27. 27

    在postgresql表分区中的表看起来像什么?我该如何调查?

  28. 28

    有什么办法可以使该节点js看起来更紧凑?

  29. 29

    当我从“随机森林”得出的混淆矩阵显示该模型不能很好地预测疾病时,为什么我的ROC图和AUC值看起来不错?

热门标签

归档