我知道在这个问题上有类似的问题,但我并不完全确定他们是在解决同样的问题。所以要明确......
我有一个现有的类库,它具有类型,业务逻辑和数据访问的名称空间。逻辑和数据访问命名空间中的类是静态的,并且具有基本的crud方法来用数据填充类型实例,或者获取已经满的类型实例并在数据库中插入或更新。
现在,除了直接引用此库的现有应用程序之外,我还想创建一个WCF服务,以便其他应用程序可以使用这些对象和方法。
我看到的每个WCF turorial都会在服务项目中创建域对象 - 但我不希望我的对象在两个地方定义。
所以我想我可以在现有的类库中引用序列化,并将类型类标记为[DataContract],将属性标记为[DataMember]。然后,在WCF项目中,使用[OperationContract]方法创建[ServiceContract]接口,以匹配我要公开的现有库中的静态逻辑类和方法。然后,从WCF项目中,引用现有的类库并通过在其中调用返回现有库类型的现有库逻辑方法的方法来实现WCF接口。
这是一个好模式吗?
答案 0 :(得分:5)
这听起来不错,但改装序列化往往比起初看起来更麻烦。我建议您将一些轻量级数据合同构建到服务层中,然后构建一个位于服务层和业务层之间的小层,以将数据合同转换为业务对象,反之亦然。
答案 1 :(得分:1)
假设您的业务对象可以序列化(具有属性Serializable),一种方法可能是创建DataContainer对象,这将是您的数据协定。此对象将在您的CRUD方法中使用。
例如你的界面可能是 更新(DataContainer obj) 插入(DataContainer obj)
等
然后,您将使用二进制序列化将对象打包为字节数组,并通过WCF以这种方式传递。另一方面,您将再次使用BinarySerialization反序列化它们。您只需确保双方(客户端和服务器)具有与业务对象类型一致的有效版本的程序集。