【问题标题】:How to inject Repository object in my Domain Entity/Model?如何在我的域实体/模型中注入存储库对象?
【发布时间】:2022-02-07 23:32:10
【问题描述】:

对于需要 DB 调用的域实体,我几乎没有要做验证。所以我想在我的域模型中使用我的存储库对象。我尝试使用依赖注入,但它不起作用,并且给了我 null

public class ObjectX : Base
{
    public IObjectRepository _ObjectRepository;

    public Location(IObjectRepository objRepo)
    {
        this._ObjectRepository= objRepo;
    }
 int someProperty{get; set;}
 
 bool validateProperty()
 {
  bool isValid =_ObjectRepository.ValidateProperty(someProperty);
  return isValid;
 }

所以这里 objRepo 为 null,因此构造函数也将 null 分配给 _ObjectRepository。我已将 放入 Startup.cs

是否可以在域模型中访问存储库对象?

【问题讨论】:

  • 我的问题是你为什么要这样做。为什么不在服务层这样做呢?
  • 我认为您的域不应该依赖于您的存储库,但您的问题在于您如何在 IoC 容器中注册存储库,因为您正在获取一个实例,但它是空的。
  • @MasoudSharfi 我有一个类似“controller->servicelayer->dataAccessLayer(repositories here)”的设计。如果我在服务层进行,每个对象都会添加很多验证。我是否应该仅出于验证目的创建特定的服务层。我只需要针对数据库验证我的属性。仅此而已。

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


【解决方案1】:

您是否已将其添加到您的 IoC 容器中?您可以在启动文件中执行此操作,

services.AddScoped<IObjectRepository, ObjectRepository>();

【讨论】:

    【解决方案2】:

    对于以数据为中心的对象,例如域实体,在对象的构造函数中注入依赖项并不是一种常见的方法。并不是说不可能从 DI 容器中解决这些依赖关系,而是 DI 容器旨在构建组件的对象图,它往往是长期存在的,而不是数据对象,它往往很短住过。一般来说,将运行时数据和存储的依赖项混合在同一个(数据)对象中会导致many complications。归结为Nikola’s 1st law of IoC

    仅存储在 IoC 容器中的服务。不要存储任何实体。

    相反,一种更常见的方法是从Constructor Injection(正如您在示例中所做的那样)移动到Method Injection。使用方法注入,您可以通过其公共 API 为已初始化的对象提供依赖项,而无需该对象存储其传入的依赖项。

    在您的情况下,使用方法注入将导致以下代码:

    public class ObjectX : Base
    {
        public int someProperty{get; set;}
     
        public bool validateProperty(IObjectRepository objRepo)
        {
            if (objRepo is null) throw new ArgumentNullException(nameof(objRepo));
            bool isValid = objRepo.ValidateProperty(someProperty);
            return isValid;
        }
    }
    

    注意方法:

    • ObjectX 的公共 API (validateProperty) 接受 IObjectRepository 作为方法参数。
    • validateProperty 确实使用但不存储传入的依赖项。

    请注意:

    • 方法可以将依赖项和运行时数据作为输入参数。
    • 这会将提供依赖项的责任转移给 ObjectX 的使用者。

    【讨论】:

      猜你喜欢
      • 2023-03-31
      • 2012-12-20
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      • 2016-10-03
      • 2015-06-04
      • 2011-09-28
      • 2018-08-03
      相关资源
      最近更新 更多