2017-09-22 41 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