2010-09-30 45 views
0

我终于开始检查最新的EF发行版,并且遇到了一些与我的测试有关的麻烦。C#EF4和分层设计的程序集引用错误

因此,我的DAL图层保存了我的.EDMX文件,并使用了MS POCO模板,因此我也生成了.TT文件和类。

我在TestProject.DAL中有一个通用的基类我创建了这些类派生自。 也就是说

public class BaseEntity<T> {} 
public class Customer : BaseEntity<Customer> {} 
public class Product : BaseEntity<Product> {} 

然后在我的TestProject.BLL层,我有一些派生类 即

public class TestProject.BLL.Customer : TestProject.DAL.Customer {} 
public class TestProject.BLL.Product : TestProject.DAL.Product {} 

然后,在我的UI层,我打电话给我的BLL.Customer对象。 我收到一个错误,说没有添加对DAL.Customer对象的引用等。

我从我的UI项目中引用了BLL项目,并从我的BLL项目中引用了DAL。

为什么UI层抱怨说它没有在该项目中引用时知道DAL层?

此外,作为一个侧面的问题,这看起来像一个“好”的设计?

谢谢大家! 鹅

回答

1

Craig是正确的 - 您的UI正在引用POCO实体类型。但我会详细说明一点。

如果你是在一个情况下你的UI项目引用BLL组件和组件引用DAL装配公开曝光从DAL装配任何成员,那么你说的话会是正确的。但这不是这里发生的事情。您正在引用BLL程序集,并且该程序集中的类型直接从DAL类型继承,因此DAL类型,它们是公开可见的。因此,编译器(正确)告诉你必须从UI项目中引用DAL程序集。

至于你的“好设计”问题,总是依赖于上下文。在不知道任何背景的情况下,我会毫不犹豫地创建一个像这样的继承树。你在BLL大会中的子课程的工作是什么?

+0

因此,引用是基于DLL类的可见性隐式的。 – Goosey 2010-09-30 18:59:47

+0

正确 - 取决于*可视性*。 – 2010-09-30 20:21:41

+0

关于我的设计,我只是试图遵循基本的n-Layered设计模式。我想保留所有我的域逻辑在BLL.dll即Users.ChangePassword()和Users.AcceptAgreement()等和所有的DAL.dll东西只有数据特定项目用户。Add()和最后BaseEntity为所有实体提供相关方法BaseEntity .GetById()BaseEntity .Search()等 – Goosey 2010-09-30 21:32:19

1

你的UI 确实参考POCO实体类型 - 通过BaseEntity泛型类型参数。

+0

感谢您的答复克雷格! – Goosey 2010-09-30 17:16:20

+0

你能详细解释一下你的答案吗? BaseEntity只在DAL中,这是由UI引用的BLL的引用。 – Goosey 2010-09-30 17:17:02

+0

我应该多说一些自己。我有2个版本的每个实体类,1个在DAL中,1个在BLL中。 – Goosey 2010-09-30 17:17:47