c# – ServiceStack,在哪里放置业务逻辑?
发布时间:2020-12-15 05:38:31 所属栏目:百科 来源:网络整理
导读:我遇到了从Service派生的类的问题,Service是ServiceStack库的一部分.如果我设置一个派生自Service的单独类并将Get或Any方法置于其中,那么一切运行正常,但问题是该类本身没有引用任何业务逻辑.只要我返回静态数据就可以了,但是如果我想将它集成到业务逻辑中那
我遇到了从Service派生的类的问题,Service是ServiceStack库的一部分.如果我设置一个派生自Service的单独类并将Get或Any方法置于其中,那么一切运行正常,但问题是该类本身没有引用任何业务逻辑.只要我返回静态数据就可以了,但是如果我想将它集成到业务逻辑中那么那就行不通了.我希望Get方法成为我的业务逻辑所在的同一个类的一部分.这是不好的设计,如果我可以做些什么来解决它?我得到的错误是派生自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); } } 解决方法
第二个代码块读取的方式表明您的服务主机和服务是同一个对象.在哪里我看到
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(),因为它继承自Service,可能会进入无限循环. 您需要分离您的疑虑 – 您的Web服务主机,Web服务和Business Logic类都是独立的.以你正在做的方式混合他们只会让你感到沮丧.将它们分成自己的类.您的业??务逻辑可以通过IoC容器传递到您的Web服务. 所以你最终得到的结果如下: 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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |