【问题标题】:ASP.NET Core Dependency Injection without referencing implementations [duplicate]不引用实现的 ASP.NET Core 依赖注入 [重复]
【发布时间】:2020-10-19 19:55:18
【问题描述】:

我正在做一个宠物项目来练习我的 .NET Core。我正在使用一个带有内置依赖注入框架的 Web 应用程序项目,就像这样

public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped<IProductRepository, ProductRepository>();

    < ... other code ... >
}

它迫使我将包含ProductRepository 实现的Data 项目的引用添加到我的WebApplication 项目中。这意味着稍后WebApplication 项目将需要引用所有其他项目并且可以滥用它——我什至不希望 Web 知道存储库,一切都应该通过服务完成。

我的问题是 - 我可以避免使用内置 DI 引用 WebApplication 中的所有其他项目吗?

(我知道我可以使用其他 DI 容器来解决这个问题)。

【问题讨论】:

  • 你可以,但只是有点。除非您愿意在运行时手动加载库,否则入口点(您的应用程序)将始终依赖于存储库 dll
  • 另一层抽象可能是要走的路?就像你说的与服务交互。据说共享一个通用或核心库是一种非常普遍的做法。
  • 你不需要显式引用repo项目,ASP.NET Core间接隐式引用。
  • 没有什么好方法,但如果你绝对不能相信你的团队能够在拉取请求期间嗅出架构侵蚀,比如不需要的命名空间,并且不能使用其他 DI 容器来解决这个问题,请考虑类似github.com/BenMorris/NetArchTest
  • 谢谢大家!它看起来确实像重复,谢谢@Steven。我无法用谷歌搜索那个。我应该删除这个问题吗?

标签: c# asp.net-core dependency-injection


【解决方案1】:

我的建议是强烈考虑将存储库接口放置在“域层”中,以便您的 Web 项目仅引用域项目。然后,您可以在测试时模拟存储库。一旦你准备好实现存储库,你可能会有强烈的动机在 Web 项目中添加对具体存储库的引用,因为你想要 DI 注入具体实现(此时你必须引用数据层,因为 DI当类为此设置构造函数时需要知道注入什么类型)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    相关资源
    最近更新 更多