2011-07-04 39 views
1

我想转换使用.NET Remoting的现有项目使用WCF。该项目的结构如下:.NET远程处理WCF - 构建解决方案以避免循环依赖

  • UI
  • BusinessLayer

的BusinessLayer项目是一个类库,它包含了客户端激活的对象DistributedProcessor它有方法IResult Process(IJobProcessor)。接口和具体类都在BusinessLayer库中。具体的类IJobProcessor反过来在BusinessLayer中使用许多类。

对于.NET Remoting来说,这种情况非常理想。分布式部分只是一个包含BusinessLayer并侦听特定端口的Windows服务。客户端使用Activator.GetObject()创建远程对象。

将其转换为WCF,我意识到我有一个循环依赖问题,如果我项目结构如下:

  • UI
  • BusinessLayer - 引用WcfService
  • WcfService - 引用BusinessLayer

该服务需要对BusinessLayer的引用,以便我可以通过网络传输对象。 BusinessLayer需要引用WcfService,以便它可以调用WcfService上的IResult Process(IJobProcessor)方法。

能否接口IResultIJobProcessor移动到一个单独的项目BusinessLayerDistributed,如:

  • UI
  • BusinessLayer - 引用BusinessLayerDistributed
  • BusinessLayerDistributed
  • WcfService - 引用BusinessLayer,BusinessLayerDistributed

我的问题是:如果所有这些接口的具体类仍然在BusinessLayer中,那么在将对象转移到服务时,它们是否会作为其具体的类来充分水合?用WCF做这件事有什么窍门吗?

+0

对于一些项目,我用这种方法取得了巨大的成功。 – ChaosPandion

回答

0

为什么业务层必须调用服务层中的任何东西?业务层不应该具有关于服务外观层的任何知识,也从客户端调用正常服务 - 从不从业务层调用,因为在服务架构中这是没有意义的。

唯一的例外可以是双向(双向)通信,但即使使用这种体系结构,您仍然不会在程序集中使用循环依赖。有一些模式可以避免这种情况 - 例如业务层可以有事件,服务层可以订阅它们。订阅将在参考业务层的服务服务层完成。如果你不喜欢事件,你可以使用Observer GoF模式。

从业务逻辑调用服务层的另一有效的方案是完全面向服务的架构,但在这种情况下,每个“服务”将拥有自己的服务组件和业务逻辑组件,你会做其中的交叉调用。

+0

我不太明白。在我的情况下,必须创建这些IJobProcessor对象。专门创建的是业务逻辑的一部分。 – robertkroll

+0

如果在服务层有方法期望参数,则通过客户端请求的反序列化创建参数。所有其他业务层类都在服务操作本身或服务层引导程序中实例化。 –