业务逻辑层和数据访问层:循环依赖我有一点架构问题。在我的项目中,我有一个业务逻辑层(BLL),其中包含我所有的业务规则、模型和接口的OOAPI。每个对象都有像getById这样的静态方法,它返回所述对象的一个??实例。每个对象还具有保存和删除等方法。这是非常简单的OO代码。现在我有一个数据访问层(DAL)包含在一个单独的命名空间中,对于每个BLL对象,我有一个DataClass或“Repository”,它执行getById和保存命令。因此,在某种程度上,BLLsave和getById方法是DataClass方法周围的薄层。publicstaticNewsItemGetByID(intid){returnDataFactory.GetNewsItemRepository().GetNewsItemById(id);为了让DataClasses返回BLL对象,它们需要知道BLL。所以现在我们有:GUI-->BLLDALDataFactory只返回实现接口的对象,所以我可以隐藏实现细节,如“OracleNewsItemRepository”。但是现在,自从我开始面向对象编程以来,一些事情一直困扰着我。在我当前的解决方案中,BLL和DAL都需要相互了解。这是一种循环依赖,最佳做法是避免循环依赖。此外,我只想公开接口(和我的DataFactory)而不是我的类。这可以通过将DAL层放在单独的程序集中来完成。这是有道理的。但是,VisualStudio不允许两个程序集相互引用。另一个问题是:C#internalaccessmodifiers不知何故我认为我的整个数据访问模式是错误的。感觉就像我在将ActiveRecord模式与DataMappers等其他东西进行卷积。我在MartinFowler的网站上花了很多时间,但是对模式的描述非常笼统,并用非常抽象的UML图进行了说明。他们没有解决我的问题。也许我有点肛门,并没有所谓的“完美的数据访问模式”。而我现在所做的并没有大错特错。但是我现在该怎么做,似乎...有什么想法吗?我认为您的数据访问模式很好。您没有做的是将您的BLL耦合到OracleDAL。您正在耦合到DAL接口。一定程度的耦合是绝对需要的,否则你将永远无法做任何事情。我假设您的DataFactory和INewsItemRepository类存在于DAL层之外。下面是我的解决方案如何组织的示例。我不使用ActiveRecord,所以这可能不适合你。核心(项目)域业务实体数据存储库接口**您的数据工厂**OracleData(项目)数据Oracle存储库实现SqlData(项目)数据Sql存储库实现UI(项目)希望这有帮助。在我看来:数据访问层(DAL)应该在POCO(普通旧CLR对象)上运行:SaveNewsItem(NewsItemDAOnewsItemDAO)。POCO是您的DAO(数据访问对象)。业务层应该包含将数据访问对象(DAO)转换为丰富的业务对象的逻辑,这可能只是DAO加上一些操作和任何修饰/丰富。DAL应该完全不知道业务逻辑层。从理论上讲,它应该可以从任何客户端调用。例如,如果您想将DAL从应用程序中分离出来并将其部署为通过WCF公开自身的单独服务,该怎么办?如上所述,BO应该通过接口(可能通过依赖注入/IoC)访问SaveNewsItem等DAL操作。您可以使用接口/依赖项注入来解决您的问题。您的业??务层(BL)包含(可能不止一个)DAL需要实现的数据访问(DA)接口。DAL项目有对BL的项目引用,以便它们可以吐出业务对象(BO)并实现DA接口。你的BO可以调用DataFactory,DataFactory可以通过依赖注入或者反射来实例化DA对象。我在工作中的许多应用程序(基于Web的客户端和智能客户端)中都使用了这种模式,并且效果非常好。它现在有点旧了,但也许你应该考虑将你的pocos/接口放在另一个组件中。Project.Data引用Project.EntitiesProject.BL引用Project.Entities和Project.DataProject.UI引用Project.Entities和Project.BL此处没有循环引用。明确地说,我喜欢将业务模型和业务逻辑视为两个独立的层。您的业??务模型就是您的POCO(普通旧CLR对象)。您的业??务逻辑层将负责使用您的业务模型和DAL接口执行验证、交易等,这些接口可以通过多种方式连接(Spring、Castle或您自己的本机IoC容器)。在DAL中实现业务模型零依赖的一种好方法是使用已建立的对象关系映射框架(ORM),例如NHibernate(我最喜欢的ORM框架的无耻插件)。IceHeat,@ClaigWilson的示例最有意义,可能源自这篇文章:http://www.codeproject.com/KB/architecture/NHibernateBestPractices.aspx。值得一读并解决域驱动开发,它解决了您在这里遇到的问题。即使您不给猴子NHibernate,我也会向任何人推荐这篇文章,这是一篇很棒的文章。我将从您的BLL(域模型)中删除任何Get()和Save()方法。这就是我要做的。GUI将要求Repository通过id获取域对象。一旦GUI具有域对象,您就可以将其添加到其他对象。这样,域层就不需要知道关于存储库的任何信息。在内部存储库中,您可以返回延迟加载或完全加载对象对象图的域对象。这将取决于您的需要。这是一篇关于同一主题的好文章......重构对象阅读DeyanPetrov如何使用动态代理的注释DAL必须是抽象的,因此它必须只包含与后端数据库交互的普通ADO.NET对象,例如连接DataAdapter、DataReader等。有了这些,您可以在Biz层中引用DAL,并且可以通过一点点抽象解决实体方面的所有问题,例如,如果您有一个客户类,您可以创建一个abstaractoin客户类以使用DAL实现交互的基本操作(如保存、更新和检索数据)和另一个继承抽象类的类重写基类方法实现来满足你的Bizvalidation等。以上是C#学习教程:业务逻辑层和数据访问层:循环依赖共享。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
