2017-09-22 54 views
0

我有一個N層解決方案。它有四個項目,如下圖所示:WCF未實施數據註釋

  1. 基礎設施(Model類)
  2. 服務(WCF)
  3. 網絡(演示)

的基礎設施都是在模型的護理類

基礎設施

using System.Runtime.Serialization; 
namespace Infrastructure 
{ 
using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.ComponentModel.DataAnnotations.Schema; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.Text; 
using System.Threading.Tasks; 
using DataAnnotationsExtensions; 

[Serializable] 
[DataContract(IsReference = true)] 
public partial class COUNTRIES 
{ 
    public COUNTRIES() 
    { 
     this.CITIES = new HashSet<CITIES>(); 
     this.LGA = new HashSet<LGA>(); 
     this.STATES = new HashSet<STATES>(); 
    } 

    [DataMember] 
    public int COUNTRY_ID { get; set; } 

    // [DataMember(Name = "Country Code")] 
    [DataMember] 
    [Required(ErrorMessage = "Country Code is required")] 
    [Display(Name = "Country Code")] 
    [StringLength(2, ErrorMessage = "The {0} must be at least {1} characters long. Plese check again!", MinimumLength = 2)] 
    //[Index(IsUnique = true)] 
    [RegularExpression(@"^[a-zA-Z]+$", ErrorMessage = "Use letters only please")] 
    public string COUNTRY_CODE { get; set; } 

    [DataMember] 
    [Required(ErrorMessage = "Country Name is required")] 
    [Display(Name = "Country Name")] 
    //[Index(IsUnique = true)] 
    //[StringLength(50, ErrorMessage = "Too long. Plese check again!")] 
    [StringLength(50, ErrorMessage = "The {0} must be at least {1} characters long. Plese check again!", MinimumLength = 2)] 
    [RegularExpression(@"^[a-zA-Z]+$", ErrorMessage = "Use letters only please")] 
    public string COUNTRY_NAME { get; set; } 

    [DataMember] 
    [Display(Name = "Action Status")] 
    public int ACTION_STATUS { get; set; } 

    [DataMember] 
    [Display(Name = "Date Created")] 
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")] 
    public Nullable<System.DateTime> CREATED_DATE { get; set; } 

    [DataMember] 
    [Display(Name = "Created By")] 
    public Nullable<int> CREATED_BY { get; set; } 

    [DataMember] 
    [Display(Name = "Last Update Date")] 
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")] 
    public Nullable<System.DateTime> LAST_UPDATE_DATE { get; set; } 

    [DataMember] 
    [Display(Name = "Last Update By")] 
    public Nullable<int> LAST_UPDATE_BY { get; set; } 

    [DataMember] 
    [Display(Name = "Date Deleted")] 
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")] 
    public Nullable<System.DateTime> DELETED_DATE { get; set; } 

    [DataMember] 
    [Display(Name = "Deleted By")] 
    public Nullable<int> DELETED_BY { get; set; } 


    [DataMember] 
    public virtual ICollection<CITIES> CITIES { internal get; set; } 

    [DataMember] 
    public virtual ICollection<LGA> LGA { internal get; set; } 

    [DataMember] 
    public virtual ICollection<STATES> STATES { internal get; set; } 
} 
} 

服務:WCF

namespace BPP.CCSP.Admin.Services.Services.Concrete 
{ 

[ValidateDataAnnotationsBehavior] 

public class CountriesService : ICountriesService 
{ 
    //public void DoWork() 
    //{ 
    //} 
    private readonly ICountriesManager _countriesManager; 

    public CountriesService(ICountriesManager countriesManager) 
    { 
     _countriesManager = countriesManager; 
    } 

    public COUNTRIES GetCountry(Int32 countryID) 
    { 
     return _countriesManager.Country(countryID); 
    } 

    public IEnumerable<COUNTRIES> GetCountries() 
    { 
     return _countriesManager.Countries(); 
    } 

    public void AddCountry(COUNTRIES countries) 
    { 
     _countriesManager.AddCountry(countries); 
    } 

    public void RemoveCountry(int countryID) 
    { 
     _countriesManager.Country(countryID); 
    } 
} 
} 

的問題是,爲何是數據註釋和驗證未在表示層(視圖)執行?

回答

0

您所忽略的一個關鍵信息是您如何將服務引用導入到Presentation Presentation項目中。

我將暫時假定您使用了服務引用嚮導 - 這是導致您的問題的原因。當您使用提供的嚮導,視覺工作室着眼於託管WSDL定義WCF服務,並自動生成你英寸的WSDL不支持您所使用的數據標註工作項目新的代理和數據合同,爲此不能複製到演示項目中定義的新合同。

要解決這個問題,您有兩種選擇。

1)導航到自動演示文稿中的項目生成的類,並將其標記。顯然,這會導致代碼長期重複,並不是最理想的。

2)通過DLL引用您的數據合約和服務合約,並編寫自己的代理類,它繼承自ClientBase。你可以在這裏找到更多細節:Create WCF Client without auto generated proxy

+0

是的你是對的。我使用**服務參考嚮導**。現在的問題是,如何申請選項2,你說**通過DLL引用您的數據合同和服務合同,並編寫自ClientBase繼承自己的代理類。你可以在這裏找到更多的細節**。請我不知道。 – Gbenga