首页 > 解决方案 > 如何正确添加实体类对其他类的依赖,减少耦合

问题描述

我正在阅读依赖倒置原则。它指出模块应该依赖于抽象。我了解大部分部分,并且可以应用它们。有一处混乱。

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

实体.cs

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

客户端类.cs

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

依赖类.cs

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

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

标签: c#design-patternscouplingdependency-inversion

解决方案


您也可以创建接口 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);
    }
}

但这对我来说看起来很有趣


推荐阅读