【发布时间】:2017-02-18 22:19:51
【问题描述】:
我在当前(悲伤)状态下的解决方案:
我希望我的业务层数据提供者不可知(这不是一件好事吗?),只需要一个接口,这样我就可以将 EF 与 NHibernate 或 Linq 切换到 Xml 或我或我的老板想要的任何类型的持久性提供者使用(或在这个项目完成后 2 秒内不可避免地发明的新的上级)。
IPersistenceProvider 是那个接口,我可以用 Unity 注入它(不是游戏平台,DI 容器)。对我来说,IPersistenceProvider 属于数据层,我们可以继续添加文件夹(如 EntityFramework),因为需要将新的持久性范例添加到我的简历(或项目)中。
因此,我的业务 dll 依赖于我的数据 dll。下面是业务 dll 中的一些代码,具体取决于数据 dll:
using System;
using Atlas.Data.Kernel;
namespace Atlas.Business.Kernel
{
public abstract class BusinessObject
{
public BusinessObject(IPersistenceProvider p)
{
}
public Guid Id;
}
}
我也觉得我的DatabaseContext 属于数据层。但是 EF 让您引用其 DbSets 的具体类型,这意味着 AtlasDataKernel dll 需要依赖于 AtlasBusinessKernel dll,这将使循环 dll 引用。 En plus(这也是法语),一个指向业务层具体类型的数据层东西对我来说很陌生。 DatabaseContext 想要在业务 dll 中上线,但这是将我的业务层与特定的持久性策略工件耦合。
如何解决这个问题?我可以将它折叠到一个 dll 中(事实上,我在以前的项目中也这样做过),但这有点糟糕,我将无法进入 .Net Architects 俱乐部。他们会嘲笑我的“1 N 太少”架构,并嘲笑我离开会议。 WWDED? (Dino Esposito 会做什么?)
【问题讨论】:
-
IPersistenceProvider 的用途是什么?
-
@SergeyBerezovskiy,它是 Bridge OO 模式中的 Bridge 接口/抽象。具体的持久性提供者(例如,
EFPersistenceProvider)将实现它。 -
您的逻辑(需要循环依赖)似乎有缺陷 - 或者您的模式选择可能不适合这项工作。 IE。我根本不明白为什么您需要依赖业务层。不清楚,也许您应该制作一个带有具体类的小项目来展示它。任何数据提供者(接口)都应该只为接口或 POCO 等提供通用方式。
-
@NSGaga,EF 需要具体引用业务类型来设置“模型”(
DbContext),例如:public virtual DbSet<Category> Categories { get; set; }
标签: c# entity-framework circular-reference