系统开发人员在这里接受培训...
我正在进行一个.net核心项目,我们试图创建一个“漂亮的架构”。
目前,我们有这些项目: Models,DAL,BLL,UI (也按这个顺序引用)。
然而,我们刚刚决定从实体框架切换到dapper,因此我们将松散延迟加载,以及来自ef的其他功能。
我的解决方案是在models类中删除“基本”models项目中的引用,并在BLL中拥有“派生”类。
然而,当我使用BL层存储库时,我发现自己需要从基本模型类转换到派生的扩展模型,从而给我一个InvalidCastException
。
我哪里错了?从一开始就这样做的“适当”方式是什么?
示例
在我的模型项目中,我将有一个class foo
,在BLL中有一个类:class foo : Models.foo
,然后在BLL存储库中有一个class fooRepository
方法,如下所示:
public foo GetFooById(int Id) {
return (foo)DAL.FooRepository.GetById(Id)
}
foo
的基类。特定的可编译示例:https://github.com/jona8690/ChildInheritanceExample
发布于 2018-10-31 06:44:19
好吧,这花了我一段时间。我大概猜到了,但是您的类实际上与其祖先具有相同的名称,但在不同的名称空间中,因此第一次阅读代码时,您的dal和bll使用的是同一个类。
那么,为什么这不起作用呢?当你转换一个对象时,答案归结于你在做什么和不在做什么。您实际上并不是在改变对象。强制转换只是将编译时检查移动到运行时检查。让我们简化一下你的例子。
这将会起作用:
object o = new Foo();
Foo myFoo = (Foo)o;
这是可以编译的,但在运行时会抛出您的invalidcastexception。
object o = new Bar();
Foo myFoo = (Foo)o;
为什么?因为Bar不是Foo。
或者在上面的评论中使用有用的水果示例。
public class Fruit {}
public class Banana : Fruit {}
public class Apple : Fruit {}
private Fruit getFruit()
{
return new Banana();
}
private void DoSomething()
{
Apple apple = (Apple)this.getFruit(); // obviously can't cast
}
但是,我听到你的抗议,我的情况是不同的,因为苹果不是从香蕉中下来的。这是真的,但是请记住,除了基本的Fruit类之外,Apple还将具有属性和方法,应用程序在处理它所知道的Apple而不是任何其他Fruity类型时可以使用这些属性和方法。
在您的案例中,您期望的是一个比您的dal提供的更专业类型的Bar
发布于 2018-10-30 21:38:26
你可以通过反省或检查属性来判断这个“水果”是否是“苹果”--然后只判断它是否能够成为“苹果”?
捕获从存储库对象返回的对象,检查/比较对象的object.GetType()结果的结果,如果合适,只返回cast/convert对象,否则是否进行适当的null返回或错误响应?
https://stackoverflow.com/questions/53064219
复制相似问题