问题描述
我正在阅读依赖倒置原则。它指出模块应该依赖于抽象。我理解大部分部分,我可以应用它们。有一个地方很混乱。
每当我们调用依赖类方法时。我们有时将参数作为对象传递。并且这个对象需要被实例化并作为参数传递
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);
}
}
但我觉得很有趣