抱歉,这个问题有些混乱...但是我感觉自己像只追着自己的尾巴的狗,现在非常困惑。
我正在尝试找出开发三层架构解决方案(IL、BL、DL)中最干净的方式,其中DL使用ORM来抽象访问数据库。
到处都是人们使用LinqToSQL或LLBLGen Pro生成表示数据库表的对象,并在所有三层中引用这些类。似乎忽略了40年的编码模式 - 或者出现了范式转移,而我错过了说明为什么这样做完全可以接受的部分。
然而,似乎仍然有一些基础原则希望成为数据存储机制不可知的 - 看看刚刚发生的LinqToSQL:写了很多代码 - 只为MS放弃它...所以我想尽可能地隔离ORM部分,只是不知道如何。
因此,回到绝对基础知识,这里是我希望以非常简洁的方式组装的基本部件:
我要从以下程序集开始工作: UL.dll BL.dll DL.dll
主要的类:
一个Message类,它具有公开集合(称为MessageAddresses)的属性,该集合包含MessageAddress对象:
class Message
{
public MessageAddress From {get;}
public MessageAddresses To {get;}
}
每个层的功能:
业务逻辑层(BL)向用户界面(UI)公开了一个名为 GetMessage(Guid id)的方法,该方法返回 Message 的一个实例。
BL 又把数据访问层(DL)包装起来。
DL 有一个 ProviderFactory,用于包装 Provider 实例。 DL.ProviderFactory 公开(可能是……我的问题的一部分)两个静态方法,分别称为 GetMessage(Guid id) 和 SaveMessage(Message message)。 最终目标是能够更换为针对 Linq2SQL 编写的提供程序,或者是针对 LLBLGen Pro 的另一个提供程序,或者是针对没有使用 ORM 的提供程序(如 VistaDB)。
设计目标: 我希望有层次分离。 我希望每个层只依赖于它下面的层,而不是它上面的层。 我希望 ORM 生成的类仅在 DL 层中存在。 我希望 UL 与 BL 共享 Message 类。
因此,这是否意味着:
a)Message 在 BL 中定义 b)数据库/ORM/手动表示数据库表的类(“DbMessageRecord”、“MessageEntity”或其他 ORM 称其为的任何名称)在 DL 中定义 c)BL 依赖于 DL d)在调用不具有 ref 或知道 BL 的 DL 方法之前,BL 必须将它们转换为 BL 实体(例如:DbMessageRecord)?
UL:
Main()
{
id = 1;
Message m = BL.GetMessage(id);
Console.Write (string.Format("{0} to {1} recipients...", m.From, m.To.Count));
}
BL:
static class MessageService
{
public static Message GetMessage(id)
{
DbMessageRecord message = DLManager.GetMessage(id);
DbMessageAddressRecord[] messageAddresses = DLManager.GetMessageAddresses(id);
return MapMessage(message,
}
protected static Message MapMessage(DbMessageRecord dbMessage. DbMessageAddressRecord[] dbAddresses)
{
Message m = new Message(dbMessage.From);
foreach(DbMessageAddressRecord dbAddressRecord in dbAddresses){
m.To.Add(new MessageAddress (dbAddressRecord.Name, dbAddressRecord.Address);
}
}
DL:
static class MessageManager
{
public static DbMessageRecord GetMessage(id);
public static DbMessageAddressRecord GetMessageAddresses(id);
}
问题: a)显然,这是很多工作,迟早会发生。 b)更多的漏洞 c)更慢 d)由于BL现在依赖于DL,并且引用DL中的类(例如DbMessageRecord),因此似乎由于这些类是由ORM定义的,您无法摆脱一个提供程序,并将其替换为另一个...这使得整个练习毫无意义...最好使用ORM的所有类来贯穿BL。 e)或者...需要在BL和DL之间添加另一个程序集,并且需要进行另一种映射,以使BL独立于底层DL类。
希望我能更清楚地提出问题...但我真的迷失了。任何帮助都将不胜感激。