如何正确地将实体类的依赖添加到其他类并减少耦合

问题描述

我正在阅读依赖倒置原则。它指出模块应该依赖于抽象。我理解大部分部分,我可以应用它们。有一个地方很混乱。

每当我们调用依赖类方法时。我们有时将参数作为对象传递。并且这个对象需要被实例化并作为参数传递

Entity.cs

public class Entity
{
    public string Prop1 {get; set;}
    public string Prop2 {get; set;}
}

ClientClass.cs

public class ClientClass
{
    private readonly IDependentClass _dep;
    public ClientClass(IDependentClass dep)
    {
         _dep = dep;
    }
    public void Method()
    {
         var e = new Entity();
         _dep.Method(e)
    }
}

DependentClass.cs

public class DependentClass: IDependentClass
{
    public void Method(Entity e)
    {
    }
}

这里的实体类只是一个数据传输对象。但它对违反 DIP 的 ClientClass 和 DependentClass 有具体的依赖。 我的理解正确吗?如何解决这个问题?

解决方法

您也可以创建接口 IEntity 以遵循 DI 原则

public interface IEntity
{
     string Prop1 {get; set;}
    string Prop2 {get; set;}
}

public class DependentClass: IDependentClass
{
    public void Method(IEntity e)
    {
    }
}

但正如@Nicosi 注意到的那样,在这种情况下,您不会通过 IEntity 接口获得太多收益。只有当您也有任何方法并且您可以将多态性和 Liskov 替换原则 (LSP) 与 DI 一起使用时,我才有意义。

我觉得使用没有多大意义

 var e = new Entity();

在 Method() 内部,因为您创建了一个空对象并破坏了 DI

试试这个

public class ClientClass
{
    private readonly IDependentClass _dep;
    public ClientClass(IDependentClass dep)
    {
         _dep = dep;
    }
    public void Method(IEntity e)
    {
      
         _dep.Method(e)
    }
}

另一种使用 DI 的方法是

public class ClientClass
{
    private readonly IDependentClass _dep;
    private readonly IEntity _ent;

    public ClientClass(IDependentClass dep,IEntity ent)
    {
         _dep = dep;
        _ent=ent;
    }
    public void Method()
    {
      
         _dep.Method(_ent);
    }
}

但我觉得很有趣

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...