c# - 如何正确添加实体类对其他类的依赖,减少耦合
问题描述
我正在阅读依赖倒置原则。它指出模块应该依赖于抽象。我了解大部分部分,并且可以应用它们。有一处混乱。
每当我们调用依赖类方法时。我们有时将参数作为对象传递。并且这个对象需要被实例化并作为参数传递
实体.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 有具体的依赖。我的理解正确吗?如何解决这个问题?
解决方案
您也可以创建接口 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);
}
}
但这对我来说看起来很有趣
推荐阅读
- javascript - AWS DynamoDB 未返回对 Lambda 函数的响应
- ios - iOS 应用开发中如何在没有前台进程的情况下监控登录表单并与之交互?
- c# - 如何使用 AngularJs 获取时间然后将其绑定到从视图到控制器的输入时间
- c - 监视 Windows 上的管道时 stdin 的状态
- sql - 避免循环依赖 - 两个表在 CREATE 语句中相互引用 - PostgreSQL
- amazon-web-services - 如何通过 CloudFront URL 限制访问
- python - Python中线程类的全局继承
- php - 如何根据数据库中的值更改开关显示
- qt - QGraphicsPixmapItem 不显示在 QGraphicsScene
- swift - SwiftUI Preview 中的可重用颜色扩展崩溃