2015-03-13 151 views
1

我希望消费者应用程序向wcf服务发送一些数据结构,然后此服务将数据传递给业务模型对象。将数据从客户端传递到wcf服务到域层

我想避免需要手动将服务数据对象的每个属性复制到新的业务对象。

例如:

[DataContract] 
public class MyServiceData 
{ 
    [DataMember] 
    public Property1() { get; set;} 
    [DataMember] 
    public Property2() { get; set;} 
    [DataMember] 
    public Property3() { get; set;} 
} 

public class MyWcfService : IMyWcfService 
{ 
    public void Operation1(MyServiceData data) 
    { 
     var obj = new DomainObject(); 
     obj.Property1 = data.Property1; 
     obj.Property2 = data.Property2; 
     obj.Property3 = data.Property3; 

     obj.DoSomething(); 
    } 
} 

我可以把MyServiceData类业务对象层中,但我不认为它是使用一个业务模型对象这些WCF服务属性,是一件好事。

有什么设计模式可以用来实现这个吗?

+1

您是否尝试过使用一个映射到移动这样的简单结构/模型之间的数据? – 2015-03-13 20:17:10

+0

但是用mapper这个副本还是会发生的吧? 不是一个好主意,保持跨层数据对象的相同的引用? 这也会避免每次添加新属性时修改复制代码 – Jonathan 2015-03-13 21:28:30

+1

这会发生,是正确的。但是Mapper使它更简单(在你的例子中4行代码)。你是正确的,一个纯粹的域模型不应该有WCF标签。如果你想要纯图层,那么需要在某个地方进行映射。 – 2015-03-13 23:04:48

回答

0

此问题的最佳解决方案是使用这样的适配器模式。 http://en.wikipedia.org/wiki/Adapter_pattern

下面是一个简单的实现:

public class MyDomainObject 
{ 
    public string MyProperty { get; set; } 
} 

[DataContract] 
public class MyDomainObjectWcfAdapter 
{ 
    private readonly MyDomainObject _object; 

    public MyDomainObjectWcfAdapter(MyDomainObject obj) 
    { 
     this._object = obj; 
    } 

    [DataMember] 
    public string MyProperty 
    { 
     get { return this._object.MyProperty; } 
     set { this._object.MyProperty = value; } 
    } 

    public MyDomainObject GetObject() 
    { 
     return this._object; 
    } 
} 
+0

当某些属性也是自定义类型从ws层复制到业务层时,此解决方案似乎过于复杂 – Jonathan 2015-03-18 13:49:38

+0

总体而言,我同意你的看法。这是使用框架的固有缺点之一......你受它的限制。有时候这会使某些解决方案变得复杂http://tomasp.net/blog/2015/library-frameworks/index.html – 2015-03-18 16:00:43

相关问题