2015-03-13 201 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

相關問題