我有一个小的架构问题。在我的项目中,我有一个业务逻辑层(BLL),其中包含所有的业务规则、模型和接口的面向对象API。每个对象都有像getById这样的静态方法,返回该对象的实例。每个对象还有像save和delete这样的方法。这是非常直观的面向对象代码。
现在我有一个数据访问层(DAL),包含在一个单独的命名空间中,对于每个BLL对象,我都有一个DataClass或“Repository”,执行getById和save命令。因此,在某种程度上,BLL保存和getById方法是DataClass方法的薄层封装。
public static NewsItem GetByID(int id)
{
return DataFactory.GetNewsItemRepository().GetNewsItemById(id);
}
为了让DataClasses返回BLL对象,它们需要知道BLL。所以现在我们有:GUI ---> BLL <---->DAL
DataFactory仅返回实现接口的对象,因此我可以隐藏实现细节,例如“OracleNewsItemRepository”。
但是自从我开始面向对象编程以来一直困扰着我的事情是,我的当前解决方案中,BLL和DAL都需要互相知道。这是循环依赖关系,并且最好避免循环依赖关系。而且我只想公开接口(和我的DataFactory),而不是我的类。这可以通过将DAL层放在单独的程序集中来完成。这是有意义的。然而,Visual Studio不允许两个程序集彼此引用。关于此的另一个问题:C#内部访问修饰符 不知何故,我觉得整个数据访问模式都错了。感觉像我混淆了ActiveRecord模式和其他东西,比如DataMappers。我在Martin Fowler的网站上花了很多时间,但那些模式描述得非常通用并且通过一个非常抽象的UML图表说明。
它们没有解决我的问题。也许我有点神经质,也许没有所谓的“完美的数据访问模式”。我现在做的事情似乎不是非常错误的。但是我现在的做法似乎有点问题……
有什么想法吗?