C# 使用接口变量在域模型中潜在地保存不同类的对象是否合法?
在我的项目中,我希望实现坚实的原则,这样我的代码可能更容易测试,并在以后进行扩展。出于这个目的,我很好奇是否可以使用Liskov的替换原则,通过让生产类和测试类都继承接口并在其位置执行操作,从而使代码测试更容易 接口+对象类 公共接口接口{ int公共变量{get;set;} } 公共类ProductionClass:接口{ 公共公共变量{get;set;} //生产变量+函数 公共产品类{} } 公共类TestClass:IInterface{ 公共公共变量{get;set;} //测试变量+函数 公共测试类{} } 域模型 公共类域模型{ //对象可以是ProductionClass或TestClass而不破坏我的数据库吗? 公共虚拟界面对象{get;set;} } 由于ProductionClass和TestClass都继承IIInterface,我知道任何一个类的对象都可以放在IIInterface变量中 但是,在构建数据库时,IInterface对象是否有效 它会保存传递给它的任何类的所有数据,还是只保存定义接口时指定的数据 如果我尝试在对象中插入不同类的对象,会发生什么?表的列是否会被新类的变量覆盖C# 使用接口变量在域模型中潜在地保存不同类的对象是否合法?,c#,entity-framework,model-view-controller,interface,solid-principles,C#,Entity Framework,Model View Controller,Interface,Solid Principles,在我的项目中,我希望实现坚实的原则,这样我的代码可能更容易测试,并在以后进行扩展。出于这个目的,我很好奇是否可以使用Liskov的替换原则,通过让生产类和测试类都继承接口并在其位置执行操作,从而使代码测试更容易 接口+对象类 公共接口接口{ int公共变量{get;set;} } 公共类ProductionClass:接口{ 公共公共变量{get;set;} //生产变量+函数 公共产品类{} } 公共类TestClass:IInterface{ 公共公共变量{get;set;} //测试变量+
我是否应该尝试以这种速度创建TestClass?您展示的类设计不是LSP Liskov替换原则的示例。这是DI依赖倒置的一个例子:具体化域模型依赖于抽象接口 要获得LSP案例,您需要:
class Base { }
class Derived : Base { }
void Process(Base item)
{
// here, the method shall not care whether 'item' is in fact
// an instance of 'Base' or 'Derived'
}
继承接口不正确。实现一个接口是正确的。这些类不能继承接口,只能实现它们
如果有一个变量、一个字段或一个IInterface类型的属性,那么只能说明以下几点:我拥有的对象实现了该接口。您不知道对象的具体类型——无论是TestClass、ProductionClass还是ThirdPartyClass,当然,除非您明确检查类型。对象内部可能完全不同。它可能包含您需要的所有数据,或者根本不包含任何数据
作为设计建议:使用接口来抽象您的服务和业务实体。使用具体类型的POCO来表示DTOs数据传输对象。编写一个小型测试应用程序并尝试。你会从中学到很多。谢谢你提供的信息。只是想澄清一下,当您说对DTO使用POCO时,您的意思是域模型对象不应该实现任何接口,也不应该在其内部使用任何接口对象,对吗?域模型不必与DTO实体模型相同。详情请阅读。此外,请检查并回答问题。