2017-09-22 13 views
0

私はN層ソリューションを持っています。以下に示すように、それは4つのプロジェクトがあります。データ注釈を実装していないWCF

  1. インフラストラクチャ(Modelクラス)
  2. リポジトリ
  3. サービス(WCF)
  4. ウェブ(プレゼンテーション)

インフラは、モデルの世話をしますクラス

インフラ

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

重要な情報は、サービス参照をプレゼンテーションプロジェクトにインポートした方法です。

私は、サービスリファレンスウィザードを使用していると想定しています。これが問題の原因です。提供されたウィザードを使用すると、Visual StudioはWCFサービスのホストされたWSDL定義を調べ、作業中のプロジェクトで新しいプロキシとデータコントラクトを自動生成します。WSDLは使用したデータアノテーションをサポートしていないため、プレゼンテーションプロジェクトで定義された新しい契約に変更します。

これを修正するには、2つの方法があります。

1)プレゼンテーションプロジェクトで自動生成されたクラスに移動し、マークアップします。明らかに、これは長期的にはコードの重複につながり、最も理想的ではありません。

2)データ契約とサービス契約をDLLで参照し、ClientBaseから継承した独自のプロキシクラスを作成します。詳細については、Create WCF Client without auto generated proxyをご覧ください。

+0

はい、あなたは正しいです。 **サービス参照ウィザード**を使用しました。質問は、あなたが書いたオプション2をどのように適用するのですか?** DLLによるデータコントラクトとサービス契約を参照し、ClientBaseを継承する独自のプロキシクラスを作成します。詳細はこちら**をご覧ください。私はそれを知らないでください。 – Gbenga

関連する問題