【发布时间】:2015-12-02 01:20:35
【问题描述】:
假设我有一个具有 3 层(组件)的假设应用程序:Data、Biz 和 Gui。
我的 Biz 程序集有一个通用基类,几乎所有其他 Biz 类都继承自:
namespace Biz
{
// Base Class
public abstract class BizBase<T>
{
public string GetDataName()
{
return typeof(T).Name;
}
abstract internal protected T GetDataObject();
}
// Child Class
public class Foo: BizBase<Data.Bar>
{
override internal protected Data.Bar GetDataObject()
{
Data.Bar ret = null;
... //Do stuff
return ret;
}
}
}
显然这是一个非常简单的示例,但我们假设 BizBase 中有很多逻辑依赖于 GetDataObect(),并且 Gui 直接使用 Biz 对象。
namespace Gui
{
public static void Main(params string[] args)
{
Biz.Foo foo = new Biz.Foo();
Console.WriteLine(foo.GetDataName);
}
}
问题:
我希望我的Biz 程序集引用我的Data 程序集,我希望我的Gui 引用Biz,但我不希望我的“Gui”程序集有一个参考我的“数据”程序集。不幸的是,如果我在Gui 中不包含对Data 的引用,则会出现编译时错误。
所以我的问题是
- 为什么
Gui需要引用Data?GetDataObject()是内部的,所以我不明白为什么需要引用才能编译。 - 如何避免让我的“Gui”程序集需要对“数据”的引用?
澄清:
-
Gui层正是您所想的。在我的例子中是 WPF,但它可以很容易地成为控制台应用程序的 Main 方法。 -
Data类实际上只是实体(在我的例子中是使用 EF 生成的 POCO)。实际的 DbContext 位于未直接引用的单独程序集中(除非使用IModules 在我的 IoC 容器中注册它)。 -
Biz类主要存储我的大部分业务和验证逻辑,并且每个都映射到单个Data类(Biz.Color继承自Biz.BizBase<Data.Color>)。 Biz 类使用IDataStore服务(即依赖注入的 DbContext)来检索/保存它们使用的特定数据对象。
最初,我有一个非泛型 BizBase 类,但我发现我在每个 Biz 类中复制了很多 CRUD 逻辑,它们与 IDataStore 和它们使用的特定实体类型进行交互。 BizBase 有几个抽象方法(除了正在使用的特定类型的实体)在每个子类中都以相同的方式实现。
通过将基类设为通用,我能够将几乎所有这些逻辑移至基类,但突然间,我的 Biz 类的任何消费者都需要直接引用我的 Data 类(我的实体)。虽然我的实体实际上不包含与数据库交互的任何逻辑,但我不愿意只为需要使用 Biz 对象的任何内容添加对它们的引用。
【问题讨论】:
标签: .net generics inheritance