【发布时间】:2016-07-12 11:06:22
【问题描述】:
我正在使用 Entity Framework Code-First 构建一个 ASP.NET Core MVC 应用程序。 我选择实现一个简单的存储库模式,为我创建的所有模型类提供基本的 CRUD 操作。 我选择遵循http://docs.asp.net 中提供的所有建议,而 DI 就是其中之一。
在 .NET 5 中,依赖注入非常适用于我们不直接实例化的任何类(例如:控制器、数据存储库……)。
我们只需通过构造函数注入它们,并在应用程序的 Startup 类中注册映射:
// Some repository class
public class MyRepository : IMyRepository
{
private readonly IMyDependency _myDependency;
public MyRepository(IMyDependency myDependency)
{
_myDependency = myDependency;
}
}
// In startup.cs :
services.AddScoped<IMyDependency, MyDependency>();
services.AddScoped<IMyRepository, MyRepository>();
我遇到的问题是,在我的一些模型类中,我想注入一些我已经声明的依赖项。
但我认为我不能使用构造函数注入模式,因为模型类通常是显式实例化的,因此我需要为自己提供依赖项,而我不能。
所以我的问题是:除了构造函数注入之外,还有其他方法可以注入依赖项吗?如何注入?例如,我在考虑属性模式或类似的东西。
【问题讨论】:
-
@kall2sollies 我认为您问题中的存储库示例并不能真正帮助传达您有关创建 model 对象并在其中注入依赖项的问题。您可能想要更改您的问题,以便您的实际意图变得更加清晰。
-
@kall2sollies:如果您的模型类需要强制依赖项,那么您的应用程序设计就会出现根本性错误。尝试详细说明为什么您的模型中需要此依赖项
-
一般你可以使用方法注入将某个服务(即
IVatCalculator通过order.CalculateVat(vatCalculator)注入你的模型类。IVatCalculator可以有一个`public Currency Calculate(Currency currency, Country country ) 方法从数据库中获取税率并根据增值税率进行计算,然后返回计算值并将其分配到您的模型中。我可以发布一个示例作为答案,说明您将如何在以 DDD 为中心的情况下进行操作使用一项或多项服务的方式,如果这是您试图通过将逻辑移动到模型来实现的目标,称为富域模型 -
@JohnErnest 只要我可以自己新建模型类,我认为您的模型就可以工作。但是 Entity Framework 自己创建新类,调用它们的默认无参数构造函数。在这种情况下,应该实现一个逻辑以避免在不满足依赖关系时出现错误。
-
@JohnErnest 你认为你可以发布你的简化解决方案作为问题的答案吗?
标签: c# dependency-injection asp.net-core