asp.net 如何在我的域实体/模型中注入Repository对象?

hfwmuf9z  于 12个月前  发布在  .NET
关注(0)|答案(2)|浏览(115)

我对一个需要DB调用的域实体做了一些验证。所以我想在我的域模型中使用我的仓库对象。我尝试使用Dependency注入,但它不做这项工作,并给我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。
是否可以在域模型中访问存储库对象?

yrwegjxp

yrwegjxp1#

对于以数据为中心的对象,例如域实体,在对象的构造函数中注入依赖关系并不是一种常见的方法。这并不是说从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的消费者。
nfg76nw0

nfg76nw02#

你已经把它添加到你的IoC容器了吗?你可以在你的启动文件中做,

services.AddScoped<IObjectRepository, ObjectRepository>();

字符串

相关问题