Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用接口变量在域模型中潜在地保存不同类的对象是否合法?_C#_Entity Framework_Model View Controller_Interface_Solid Principles - Fatal编程技术网

C# 使用接口变量在域模型中潜在地保存不同类的对象是否合法?

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;} //测试变量+

在我的项目中,我希望实现坚实的原则,这样我的代码可能更容易测试,并在以后进行扩展。出于这个目的,我很好奇是否可以使用Liskov的替换原则,通过让生产类和测试类都继承接口并在其位置执行操作,从而使代码测试更容易

接口+对象类

公共接口接口{ int公共变量{get;set;} } 公共类ProductionClass:接口{ 公共公共变量{get;set;} //生产变量+函数 公共产品类{} } 公共类TestClass:IInterface{ 公共公共变量{get;set;} //测试变量+函数 公共测试类{} } 域模型

公共类域模型{ //对象可以是ProductionClass或TestClass而不破坏我的数据库吗? 公共虚拟界面对象{get;set;} } 由于ProductionClass和TestClass都继承IIInterface,我知道任何一个类的对象都可以放在IIInterface变量中

但是,在构建数据库时,IInterface对象是否有效

它会保存传递给它的任何类的所有数据,还是只保存定义接口时指定的数据

如果我尝试在对象中插入不同类的对象,会发生什么?表的列是否会被新类的变量覆盖


我是否应该尝试以这种速度创建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实体模型相同。详情请阅读。此外,请检查并回答问题。