C# 实体框架-MVC-将从模型中的数据库(POCO对象)请求的数据类型转换为视图中使用的业务对象
我正在使用MVC模式和实体框架4.1。我有三个项目:模型(M)、视图(V)和控制器(C) 由于模型和视图使用不同的实体(尽管它们具有相同的属性和名称,但由于属于不同的名称空间,它们被视为不同的对象),因此我必须将数据从模型对象转换为视图对象。这个转换是使用我在上面评论的项目MV中包含的接口(InterfaceMV)中的转换器(接口)完成的。接口EMV如下所示:C# 实体框架-MVC-将从模型中的数据库(POCO对象)请求的数据类型转换为视图中使用的业务对象,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我正在使用MVC模式和实体框架4.1。我有三个项目:模型(M)、视图(V)和控制器(C) 由于模型和视图使用不同的实体(尽管它们具有相同的属性和名称,但由于属于不同的名称空间,它们被视为不同的对象),因此我必须将数据从模型对象转换为视图对象。这个转换是使用我在上面评论的项目MV中包含的接口(InterfaceMV)中的转换器(接口)完成的。接口EMV如下所示: public interface IDataTypeConverterEntityA { string Property1 {g
public interface IDataTypeConverterEntityA
{
string Property1 {get; set;}
int Property2 {get; set; }
}
接口EMV由模型中的EntityA和视图中的EntityA实现。因此,一旦我从视图中从模型中检索数据:
Namespace.Model.EntityA a = context.EntitiesA.Find(id);
// I retrieve the matching entity from the context
EntityA aConverted = DataTypeConverter.Convert<Namespace.Model.EntityA, EntityA>(a);
我必须将“a”对象(类型为Namespace.Model.EntityA)转换为视图中的等效对象:
EntityA aConverted = DataTypeConverterEntityA.Convert<Namespace.Model.EntityA, EntityA>(a);
EntityA aConverted=DataTypeConverterEntityA.Convert(a);
转换器的名称如下所示(它位于DataTypeConverterEntityA类中):
公共静态Y转换(T itemToConvert)
其中T:new(),IDataTypeConverterEntityA
其中Y:new(),IDataTypeConverterEntityA
{
返回新的Y
{
property1=itemToConvert.property1,
property2=itemToConvert.property2
};
}
基本上,我有表示数据库中表的POCO实体,我有一些业务类,我使用转换器从一个转换到另一个
问题如下:
1.-由于包含接口EMV的project MV既不引用模型也不引用视图,因此转换方法只能转换标量类型,而不能转换其他类型,例如EntityB属性,因此一旦获得转换对象A并在视图中转换:
Namespace.Model.EntityA a = context.EntitiesA.Find(id);
// I retrieve the matching entity from the context
EntityA aConverted = DataTypeConverter.Convert<Namespace.Model.EntityA, EntityA>(a);
//我从上下文中检索匹配的实体
EntityA aConverted=DataTypeConverter.Convert(a);
我必须对数据库执行另一个请求以获取EntityB,然后将其转换,最后通过执行以下操作将其从视图分配到EntityA.EntityB:
// I retrieve the matching entity from the context
Namespace.Model.EntityA a = context.EntitiesA.Find(id);
EntityA aConverted = DataTypeConverterEntityA.Convert<Namespace.Model.EntityA, EntityA>(a);
// Inject values into the entity
Namespace.Model.EntityB b = context.EntitiesB.Find(id);
EntityB bConverted = DataTypeConverterEntityB.Convert<Namespace.Model.EntityB, EntityB>(b);
aConverted.entityB = bConverted;
//我从上下文中检索匹配的实体
Namespace.Model.EntityA a=context.EntitiesA.Find(id);
EntityA a a converted=DataTypeConverterEntityA.Convert(a);
//将值注入实体
Namespace.Model.EntityB=context.EntitiesB.Find(id);
EntityB bConverted=DataTypeConverterEntityB.Convert(b);
aConverted.entityB=b转换;
2.-如您所见,我必须为每个实体配备一个转换器,因为从视图中,我无法处理从数据库请求接收的对象,因为视图使用自己的实体。。。。。显然,我必须在每个实体中实现接口,模型实体和视图实体中的接口
原因是我完全隔离了模型项目,它使用自己的实体,视图也使用自己的实体
也许将实体(EntityA、EntityB等)仅保留在一个位置并在模型和视图之间共享它们可以解决此问题。。。。避免使用数据类型转换器
所以我的问题是:有没有更好的方法避免每次使用数据类型转换器?或者,您认为这种架构很好,因为它将模型与视图隔离开来?使用这种方法,如果您在视图中更改了它的实体,则不会影响它的模型,因为它有自己的实体。我的问题是每次都使用数据类型转换器
有什么想法吗?不确定这是否真的是堆栈溢出的问题(感觉太像“你对……有什么看法”),但由于你花了时间输入了这么长的解释,我将提供我的两分钱: 我觉得你的设计太复杂了。有一句格言是关于“解决方案的复杂性不应超过问题的复杂性”,感觉就像你已经做到了(如果没有问题的具体背景知识,很难说)。值得一提的是,我发现SoC和复杂性之间的最佳折衷方式是:
HTH.不确定这是否真的是堆栈溢出的问题(感觉太像“你对……有什么看法”),但由于你花了时间输入了这么长的解释,我将提供我的两分钱: 我觉得你的设计太复杂了。有一句格言是关于“解决方案的复杂性不应超过问题的复杂性”,感觉就像你已经做到了(如果没有问题的具体背景知识,很难说)。值得一提的是,我发现SoC和复杂性之间的最佳折衷方式是:
public static Y Convert<T, Y>(T itemToConvert)
where T : new(), IDataTypeConverterEntityA
where Y : new(), IDataTypeConverterEntityA
{
return new Y
{
property1 = itemToConvert.property1,
property2 = itemToConvert.property2
};
}
// I retrieve the matching entity from the context
EntityA aConverted = DataTypeConverter.Convert<Namespace.Model.EntityA, EntityA>(a);
// I retrieve the matching entity from the context
Namespace.Model.EntityA a = context.EntitiesA.Find(id);
EntityA aConverted = DataTypeConverterEntityA.Convert<Namespace.Model.EntityA, EntityA>(a);
// Inject values into the entity
Namespace.Model.EntityB b = context.EntitiesB.Find(id);
EntityB bConverted = DataTypeConverterEntityB.Convert<Namespace.Model.EntityB, EntityB>(b);
aConverted.entityB = bConverted;