2013-05-28 4 views
5

मुझे कक्षा के साथ समस्या है जो Service से प्राप्त होता है, जो ServiceStack लाइब्रेरी का हिस्सा है। अगर मैं एक अलग वर्ग स्थापित करता हूं जो Service से प्राप्त होता है और Get या Any विधियों को तब रखता है, तो सब ठीक हो जाता है, हालांकि समस्या यह है कि उस वर्ग में किसी भी व्यावसायिक तर्क का संदर्भ नहीं है। यह तब तक ठीक है जब तक मैं स्थिर डेटा वापस करता हूं लेकिन अगर मैं इसे व्यापार तर्क में एकीकृत करना चाहता हूं तो वह काम नहीं कर रहा है। मैं गेट विधि को उसी वर्ग का हिस्सा बनना चाहता हूं जिसमें मेरा व्यवसाय तर्क झूठ बोलता है। क्या वह खराब डिज़ाइन है और यदि मैं इसे पाने के लिए क्या कर सकता हूं? मुझे जो त्रुटि मिल रही है वह यह है कि Service से प्राप्त कक्षा जो भी कारण से तत्काल हो जाती है (जो मेरी वर्तमान समझ के अनुसार मुझे बहुत कम समझ में आता है)। क्या कक्षा Service से प्राप्त होनी चाहिए, न केवल रूटिंग तर्क को हल करें?सर्विसस्टैक, व्यवसाय तर्क कहां रखना है?

यहाँ कुछ कोड मेरी समस्या को वर्णन करने के:

इस कोड को ठीक चलता है, लेकिन समस्या यह है कि वर्ग DTO वर्ग ClassWithBusinessLogic की सामग्री के बारे में कुछ नहीं जानता:

public class ClassWithBusinessLogic 
{ 
    public ClassWithBusinessLogic() 
    { 
     string hostAddress = "http://localhost:1337/"; 

     WebServiceHost host = new WebServiceHost("MattHost", new List<Assembly>() { typeof(DTOs).Assembly }); 
     host.StartWebService(hostAddress); 
     Console.WriteLine("Host started listening...."); 

     Console.ReadKey(); 
    } 
} 

public class HelloWorldRequest : IReturn<string> 
{ 
    public string FirstWord { get; set; } 

    public HelloWorldRequest(string firstWord) 
    { 
     FirstWord = firstWord; 
    } 
} 

public class DTO : Service 
{ 
    public string Get(HelloWorldRequest request) 
    { 
     return request.FirstWord + " World!!!"; 
    } 
} 

अब, निम्नलिखित वास्तव में क्या है मैं चाहता हूं लेकिन कोड अप्रत्याशित व्यवहार करता है, अनिवार्य रूप से यह काम नहीं कर रहा है:

public class ClassWithBusinessLogic : Service 
{ 
    private string SomeBusinessLogic { get; set; } 

    public ClassWithBusinessLogic() 
    { 
     string hostAddress = "http://localhost:1337/"; 

     //Simplistic business logic 
     SomeBusinessLogic = "Hello"; 

     WebServiceHost host = new WebServiceHost("MyHost", new List<Assembly>() { typeof(DTO).Assembly }); 
     host.StartWebService(hostAddress); 
     Console.WriteLine("Host started listening...."); 

     Console.ReadKey(); 
    } 

    public string Get(HelloWorldRequest request) 
    { 
     return SomeBusinessLogic; 
    } 
} 

public class HelloWorldRequest : IReturn<string> 
{ 
    public string FirstWord { get; set; } 

    public HelloWorldRequest(string firstWord) 
    { 
     FirstWord = firstWord; 
    } 
} 

निम्नलिखित सीएल चलाने के लिए अपने दूसरे कोड ब्लॉक से पता चलता है कि आपके सेवा होस्ट और अपने सेवा का उद्देश्य एक ही कर रहे हैं पढ़ता

public class WebServiceHost : AppHostHttpListenerBase 
{ 
    public WebServiceHost(string hostName, List<Assembly> assembliesWithServices) : base(hostName, assembliesWithServices.ToArray()) 
    { 
     base.Init(); 
    } 

    public override void Configure(Funq.Container container) 
    { } 

    public void StartWebService(string hostAddress) 
    { 
     base.Start(hostAddress); 
    } 

    public void StopWebService() 
    { 
     base.Stop(); 
    } 
} 

public class WebServiceClient 
{ 
    private JsonServiceClient Client { get; set; } 

    public WebServiceClient(string hostAddress) 
    { 
     Client = new JsonServiceClient(hostAddress); 
    } 

    public ResponseType Get<ResponseType>(dynamic request) 
    { 
     return Client.Get<ResponseType>(request); 
    } 

    public void GetAsync<ResponseType>(dynamic request, Action<ResponseType> callback, Action<ResponseType, Exception> onError) 
    { 
     Client.GetAsync<ResponseType>(request, callback, onError); 
    } 
} 

class Client_Entry 
{ 
    static void Main(string[] args) 
    { 
     Client client = new Client(); 
    } 
} 

public class Client 
{ 

    public Client() 
    { 
     Console.WriteLine("This is the web client. Press key to start requests"); 
     Console.ReadKey(); 

     string hostAddress = "http://localhost:1337/"; 
     WebServiceClient client = new WebServiceClient(hostAddress); 

     var result = client.Get<string>(new HelloWorldRequest("Hello")); 
     Console.WriteLine("Result: " + result); 

     Console.WriteLine("Finished all requests. Press key to quit"); 
     Console.ReadKey(); 
    } 

    private void OnResponse(HelloWorldRequest response) 
    { 
     Console.WriteLine(response.FirstWord); 
    } 

    private void OnError(HelloWorldRequest response, Exception exception) 
    { 
     Console.WriteLine("Error. Exception Message : " + exception.Message); 
    } 

} 
+0

आप थोड़ा और अपने कोड अलग करना चाहिए, एक वर्ग जो सेवा से निकला है अभी भी सिर्फ वेब सेवा के मुद्दों, यानी साथ सौदा करना चाहिए - की स्थापना त्रुटि कोड, और व्यापार तर्क नहीं, आईएमओ। – Mithir

+0

मेले पॉइंट्स, लेकिन यह सवाल का जवाब नहीं देता है कि मैं क्लासविथ बिजनेस लॉजिक के भीतर स्ट्रिंग 'कुछ बिजनेस लॉजिक' उदाहरण के लिए कैसे लौटता हूं। –

उत्तर

3

रास्ता: गधे के साथ-साथ की जरूरत है। मैं

public ClassWithBusinessLogic() 
{ 
    string hostAddress = "http://localhost:1337/"; 

    //Simplistic business logic 
    SomeBusinessLogic = "Hello"; 

    WebServiceHost host = new WebServiceHost("MyHost", new List<Assembly>() { typeof(DTO).Assembly }); 
    host.StartWebService(hostAddress); 
    Console.WriteLine("Host started listening...."); 

    Console.ReadKey(); 
} 

कहाँ देख निर्माता तो ServiceStack WebServiceHost को दर्शाता है यही कारण है कि, अपने स्वयं के विधानसभा में पारित - यह मेरे लिए सुराग विश्वास है कि ServiceStack तो फिर से प्रारंभ हो जाएगा ClassWithBusinessLogic() के बाद से यह सेवा से विरासत, संभवतः एक अनंत नीचे जा रहा पाश।

आपको अपनी चिंताओं को अलग करने की आवश्यकता है - आपका वेब सेवा होस्ट, आपकी वेब सेवा, और आपके व्यवसाय तर्क वर्ग सभी अलग हैं। जिस तरह से आप कर रहे हैं उन्हें सह-संयोजित करना केवल आपको निराशा के लिए नेतृत्व करने जा रहा है। उन्हें अपने वर्गों में अलग करें। आपके व्यापार तर्क को आईओसी कंटेनर के माध्यम से आपकी वेब सेवा में पारित किया जा सकता है।

तो तुम जैसे कुछ को रखना होगा:

class BusinessLogicEngine : IBusinessLogic 
---> Define your business logic interface and implementation, and all required business object entities 

class WebService : Service 
    constructor(IBusinessLogic) 
---> Purely handles mapping incoming requests and outgoing responses to/from your business object entities. Recommend using AutoMapper (http://automapper.org/) 
---> Should also handle returning error codes to the client so as not to expose sensitive info (strack traces, IPs, etc) 


class WebServiceHost 
---> Constructor initializes the WebServiceHost with the typeof(WebService) from above. 
संबंधित मुद्दे