相关疑难解决方法(0)

Microsoft如何创建具有循环引用的程序集?

在.NET BCL中有以下循环引用:

  • System.dllSystem.Xml.dll
  • System.dllSystem.Configuration.dll
  • System.Xml.dllSystem.Configuration.dll

这是.NET Reflector的截图,显示了我的意思:

在此输入图像描述

微软如何创建这些程序集对我来说是一个谜.是否需要特殊的编译过程才允许这样做?我想象这里有一些有趣的东西.

.net assemblies circular-reference base-class-library

105
推荐指数
5
解决办法
1万
查看次数

业务逻辑层和数据访问层:循环依赖

我有一点架构问题.在我的项目中,我有一个业务逻辑层(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图表来说明.

他们没有解决我的问题.也许我有点肛门,而且没有"完美的数据访问模式"这样的东西.我现在所做的事情似乎并不严重.但我现在怎么做,好像......

有任何想法吗?

c# architecture design-patterns

23
推荐指数
3
解决办法
2万
查看次数

从编码风格的角度来看,循环类依赖是不是很糟糕?

从编码风格的角度来看,循环类依赖是不是很糟糕?

例:

在数据库应用程序中,我们有两个类,一个封装有关单个数据库(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)

我的同事认为这是不好的做法,如果只有一个依赖方向而没有像这里那样的循环方向会更好.

这是不好的做法,反模式还是代码味道?有什么缺点吗?

language-agnostic oop dependencies

17
推荐指数
3
解决办法
5786
查看次数

如何在这里避免循环依赖

有没有办法避免循环依赖,除了混合模块,在这样的安排(它是国际象棋应用程序)

详细描述:

  • Gui一个导入ChessWidget模块的模块;
  • ChessWidget只需包装ChessWorld模块并导入CellButton;
  • CellButton模块导入模块Cell;
  • 所述ChessWorld模块进口Board(以表示它)和Players(通知他们和他们的取移动);
  • Board模块导入模块Piece;
  • Piece模块导入模块Player;

这里是问题:

Player模块需要了解其他玩家和董事会,从而进口ChessWorld!

简短的介绍:

World模块需要了解的Player模块(甚至间接Board/ Piece),并Player需要了解World.

非常感谢帮助.

PS:不是因为我不能使用循环依赖,而是因为它们是邪恶的.

design-patterns

15
推荐指数
2
解决办法
2万
查看次数

构造函数依赖注入的循环依赖性

我在一个项目中使用Netty(4.0.4.Final),并且我一直在遇到一个我需要考虑的循环依赖.这个问题主要涉及分解循环依赖的概念,但我会在熟悉的人中使用一些Netty术语.既然我的问题实际上并不在于Netty,我决定不对其进行标记.

下面,我发布了我的代码,省略了我认为不相关的部分.

情况

我有一个MyServer类添加ChannelInboundHandlerAdapterBootstrap:

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需要添加ChannelInboundHandlerAdapterChannelPipeline:

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)

java factory circular-dependency code-cleanup

5
推荐指数
1
解决办法
1508
查看次数