2010-09-28 16 views
7

Web hizmeti erişimi ve "doğrudan" erişim arasında kolayca geçiş yapmak için bir Web Başvurusu (WCF değil) için oluşturulmuş proxy sınıfının ortak bir arabirim uygulayabilmesinin bir yolunu arıyorum. istemci uygulamasında iş katmanı, gibi bir şey:Web Service proxy sınıfı arabirimi uygulamak için

public IBusiness GetBusinessObject() 
{ 
    if (_mode = "remote") 
    return new BusinessWebService.Business(); // access through web service proxy class 
    else 
    return new Business(); // direct access 
} 

Ancak (örneğin aşağıdaki örneklerde CustomSerializableType) oluşturulan proxy sınıfında başvurulan olmayan özel türleri. Bunun yerine yeni, özdeş türler üretilir, bu da proxy sınıfının arabirimi gerçekleştirmesini imkansız kılar.

Oluşturulan proxy sınıfı başvurusunu bu tür bir şekilde yapmak için bir yol var mı, yoksa tüm bu yanlış mı yapıyorum? Web servisini bunun yerine bir WCF servisine dönüştürmeyi düşünmeli miyim?


Detaylar Çözümümüz bu dört projeden oluşmaktadır

: (veri deposu, iş mantığını içeren kere)

  • Yaygın bir kütüphane (ortak içeriyor

    • Bir iş kütüphanesi CustomSerializableType)
    • A web ser

      • Yerel modu:

      Müşterimiz windows uygulaması iki farklı modda çalıştırmak mümkün isteyen

    • bir windows uygulaması yardımcısı (uzaktan müşteriler ve iş katmanı arasında bir proxy gibi davranır) uygulama basitçe erişim verilerine doğrudan uygulama verilerini
    erişmek için web hizmeti ile iletişim kurar
  • Uzaktan modunu, iş kitaplığını kullanır nerede

    Bunu yapmak için, ortak kitaplıkta bulunan ve tüm iş yöntemlerini içeren bir arabirim olan IBusiness'ı yarattık.

    Arayüz

    public interface IBusiness 
    { 
        CustomSerializableType DoSomeWork(); 
    } 
    

    İş katmanı

    public class Business : IBusiness 
    { 
        public CustomSerializableType DoSomeWork() 
        { 
        // access data store 
        } 
    } 
    

    Web hizmeti

    public class WebServiceBusiness : IBusiness 
    { 
        private Business _business = new Business(); 
    
        [WebMethod] 
        public CustomSerializableType DoSomeWork() 
        { 
        return _business.DoSomeWork(); 
        } 
    } 
    

    Oluşturulan vekil sınıf müvekkiline varsayılan ad alanı aşağıdaki "Müşteri", web referansı "Proxy" olarak adlandırılır ve bu, o zaman bunu olduğunu varsayarsak (okunabilmesi için dışarı sol kod bir ton)

    public partial class Business 
        : System.Web.Services.Protocols.SoapHttpClientProtocol 
    { 
    
        public CustomSerializableType DoSomeWork() 
        { 
        // ... 
        } 
    
        public partial class CustomSerializableType { 
        // PROBLEM: this new type is referenced, instead of the 
        // type in the common library 
        } 
    } 
    
  • +0

    Vekil sınıflarını oluşturmak için svcutil.exe kullanıyor musunuz? –

    +0

    Hayır, şu anda sadece Visual Studio 2010 yerleşik araçlarını kullanıyorum. Wsdl.exe ile biraz uğraşmaya çalıştı, ama sorunlarımı çözmedi. Svcutil.exe daha iyi bir alternatif mi? Bu, 'eski' Web Servisleri yerine WCF hizmetlerine yükseltme yapmamı gerektirmez mi? – bernhof

    cevap

    6

    ;

    1. İstemci projenizin kökeninde "Proxy" adlı bir klasör oluşturun.
    2. Bu klasörde "Business" adlı bir sınıf oluşturun.
    3. o sınıf kamu ve kısmi olun ve sizin IBusiness Interface

    Bu yöntemi uygulayan varsa, Reference.cs değiştirmeye gerek yoktur. asla asla Reference.cs veya kod oluşturma yoluyla üretilen başka bir dosyayı değiştirmemelisiniz.

    Bu durumun, istemcinizi hizmetinize sıkıca bağlayarak SOA'nın ilkelerini ihlal ettiğini unutmayın. En azından, bu arayüzleri ayrı bir projede tanımlamalısınız, böylece "arayüz" projesini müşteri ve hizmet arasında paylaşıyorsunuz.

    +0

    Peki, Reference.cs dosyasında bulunan (ve bazı durumlarda Reference.map altında .datasource dosyaları olarak var olan) 'klonlanmış' türleri nedir? Bu sınıflar, metot imzalarını etkin bir şekilde değiştirirler, böylece arayüzde yer alanlarla uyuşmazlar, böylece ilk önce uygulamamı engellerler. Yoksa burada bir şey mi özlüyorum? – bernhof

    +0

    Evet, bir şey kaçırdınız! Proxy türleri arabirim ile eşleşmiyorsa, arabirimi uygulayamazlar. Arabirimi uygulayan, ancak işlerini yapmak için web hizmetini çağıran kendi ayrı tipler grubunuzu oluşturmanız gerekir. Bu, bir veritabanı kullanılan ve bir XML dosyası kullanan bir uygulama arasında geçiş yapmak istediğinizde tam olarak ne yapacağınızdır. –

    +0

    Web hizmetini çağırmak için, arabirim tarafından başvurulan türleri (ör. 'Common.CustomSerializableType') proxy sınıfı tarafından kullanılan (klonlanmış) türlere (ör.' Proxy.CustomSerializableType') manuel olarak dönüştürmem gerekiyor mu? – bernhof