在.NET BCL中有以下循环引用:
System.dll 和 System.Xml.dllSystem.dll 和 System.Configuration.dllSystem.Xml.dll 和 System.Configuration.dll这是.NET Reflector的截图,显示了我的意思:

微软如何创建这些程序集对我来说是一个谜.是否需要特殊的编译过程才允许这样做?我想象这里有一些有趣的东西.
我有一点架构问题.在我的项目中,我有一个业务逻辑层(BLL),其中包含我的所有业务规则,模型和接口的OO API.每个对象都有像getById这样的静态方法,它们返回所述对象的实例.每个对象也有像save和delete这样的方法.这是非常简单的OO代码.
现在我有一个DataAccess层(DAL),包含在一个单独的命名空间中,对于每个BLL对象,我有一个DataClass或"Repository",它执行getById和save命令.所以在某种程度上,BLL save和getById方法是围绕DataClass方法的薄层.
public static NewsItem GetByID(int id)
{
return DataFactory.GetNewsItemRepository().GetNewsItemById(id);
}
Run Code Online (Sandbox Code Playgroud)
为了让DataClasses返回BLL对象,他们需要知道BLL.所以现在我们有:
GUI ---> BLL <----> DAL
DataFactory只返回实现接口的对象,因此我可以隐藏"OracleNewsItemRepository"之类的实现细节.
但是现在,自从我开始面向对象编程以来一直困扰着我的事情.在我目前的解决方案中,BLL和DAL都需要相互了解.这是循环依赖关系,最佳做法是避免循环依赖关系.另外,我只想公开接口(和我的DataFactory),而不是我的类.这可以通过将DAL层放在单独的Assembly中来完成.这是有道理的.但是,Visual Studio不允许两个程序集相互引用.另一个问题是:C#内部访问修饰符
不知怎的,我认为我的整个数据访问模式错了.感觉就像我正在使用DataMappers等其他东西来卷积ActiveRecord模式.我花了很多时间在Martin Fowler的网站上,但这些模式被描述得非常通用,并用非常抽象的UML图表来说明.
他们没有解决我的问题.也许我有点肛门,而且没有"完美的数据访问模式"这样的东西.我现在所做的事情似乎并不严重.但我现在怎么做,好像......
有任何想法吗?
从编码风格的角度来看,循环类依赖是不是很糟糕?
例:
在数据库应用程序中,我们有两个类,一个封装有关单个数据库(DBInfo)的信息,另一个类可以创建数据库连接.(ConnFactory)
DBInfo具有getConnection其使用方法ConnFactory来创建连接.但是ConnFactory它本身需要一个DBInfo对象来做到这一点.
像这样:(为了便于阅读,忽略了任何编码风格)
class DBInfo {
String name;
String connectionUrl;
Connection getConnection() {
return ConnFactory.getConnection(this);
}
}
class ConnFactory {
Connection getConnection(DBInfo toWhat) {
return new Connection(toWhat.connectionUrl);
}
}
Run Code Online (Sandbox Code Playgroud)
我的同事认为这是不好的做法,如果只有一个依赖方向而没有像这里那样的循环方向会更好.
这是不好的做法,反模式还是代码味道?有什么缺点吗?
有没有办法避免循环依赖,除了混合模块,在这样的安排(它是国际象棋应用程序)
详细描述:
Gui一个导入ChessWidget模块的模块;ChessWidget只需包装ChessWorld模块并导入CellButton;CellButton模块导入模块Cell;ChessWorld模块进口Board(以表示它)和Players(通知他们和他们的取移动);Board模块导入模块Piece;Piece模块导入模块Player;这里是问题:
该Player模块需要了解其他玩家和董事会,从而进口ChessWorld!
简短的介绍:
该World模块需要了解的Player模块(甚至间接Board/ Piece),并Player需要了解World.
非常感谢帮助.
PS:不是因为我不能使用循环依赖,而是因为它们是邪恶的.
我在一个项目中使用Netty(4.0.4.Final),并且我一直在遇到一个我需要考虑的循环依赖.这个问题主要涉及分解循环依赖的概念,但我会在熟悉的人中使用一些Netty术语.既然我的问题实际上并不在于Netty,我决定不对其进行标记.
下面,我发布了我的代码,省略了我认为不相关的部分.
我有一个MyServer类添加ChannelInboundHandlerAdapter到Bootstrap:
public class MyServer extends AbstractMyServer {
private Integer someInteger; //Using Integer just for example's sake.
public MyServer(MyServerInitializer initializer) {
//...
bootstrap.handler(initializer);
//...
}
public void updateInteger(Integer value) {
someInteger = value;
//Send an update packet to another server.
}
}
Run Code Online (Sandbox Code Playgroud)
MyServerInitializer需要添加ChannelInboundHandlerAdapter到ChannelPipeline:
public class MyServerInitializer extends ChannelInitializer<SocketChannel> {
private ChannelInboundHandlerAdapter handler;
public MyServerInitializer(ChannelInboundHandlerAdapter handler) {
this.handler = handler;
}
@Override
protected void initChannel(SocketChannel ch) throws Exception …Run Code Online (Sandbox Code Playgroud) .net ×1
architecture ×1
assemblies ×1
c# ×1
code-cleanup ×1
dependencies ×1
factory ×1
java ×1
oop ×1