我正在使用ServiceStack将一些对象序列化和反序列化为JSON.考虑这个例子:
public class Container
{
public Animal Animal { get; set; }
}
public class Animal
{
}
public class Dog : Animal
{
public void Speak() { Console.WriteLine("Woof!"); }
}
var container = new Container { Animal = new Dog() };
var json = JsonSerializer.SerializeToString(container);
var container2 = JsonSerializer.DeserializeFromString<Container>(json);
((Dog)container.Animal).Speak(); //Works
((Dog)container2.Animal).Speak(); //InvalidCastException
Run Code Online (Sandbox Code Playgroud)
最后一行抛出InvalidCastException,因为Animal字段被实例化为Animal类型,而不是Dog类型.有什么办法可以告诉ServiceStack保留这个特定实例属于Dog类型的信息吗?
我参考ServiceStack文档注册使用POCO:
由于它促进了干净,可重复使用的代码,ServiceStack始终鼓励使用代码优先的POCO来处理所有事情.
即可以使用相同的POCO:
在请求和响应中DTO(在客户端和服务器上)
在JSON,JSV和CSV文本序列化器中
作为OrmLite,db4o和NHibernate中的数据模型
作为存储在Redis中的实体
作为存储在缓存和会话中的blob
在MQ的服务中删除并执行"
我喜欢servicestack以及使用它编写Web服务是多么容易.我试图了解如何最好地设置我的项目,而不是遇到任何问题.
具体来说,我正在与返回响应对象的架构理念作斗争,该对象也是一个数据模型(如SS所建议的).关注分离的想法在我内心过于根深蒂固.如果你对所有事情都使用相同的POCO,那么将不会遇到问题.例如,返回例如视图对象不是"更安全"吗?
我目前正在评估ServiceStack(在.Net中创建基于休息的服务).其中一个感兴趣的领域是测试方面.我的休息服务将注入一些应用程序服务(目前使用Autofac).我需要的是一种机制来测试其余层并在我的应用层上定义期望(通过MOQ),所以我没有进行集成测试,而是单元测试这一层?
关于如何做到这一点的任何想法?
需要ResponseStatus吗?
维基说我们需要在响应DTO中有一个ResponseStatus属性来处理异常序列化:
https://github.com/ServiceStack/ServiceStack/wiki/Validation
但是,即使响应DTO中没有ResponseStatus属性,它看起来也会自动生成ResponseStatus.
我们需要ResponseStatus属性吗?
这些架构的优点和缺点是什么?
通过RPC我的意思是远程过程调用服务,如WCF,WebServices等.
然后在另一方面,有更多面向消息的框架,如MSMQ,NServiceBus,ServiceStack等.
然后是混合方法,例如WebAPI,它是某种远程活动记录模式(开箱即用它只支持非常有限数量的动词,如"Get","Put","Post"等).
无视,它是如何实际实现的(也就是说.我并不真正关心耐久性,事务等等,因为无论抽象如何都可以实现),这些抽象的优点和缺点是什么?
同样,请不要提供低级别的实施细节,我只想在声音架构,最佳模式和实践方面,甚至是最适合采用每种方式和原因的情况方面做出改变.
我一直在试验ServiceStack框架来开发一个简单的REST API.我正在尝试正确定义路由以处理我想要的不同URL时遇到麻烦.
我有一个简单的DomainModel类:
public class Student
{
public int Id { get; set; } // unique
public string Email { get; set; } // not unique
// some other properties and business logic
}
Run Code Online (Sandbox Code Playgroud)
我想创建一个REST服务来响应对以下URL的HTTP请求:
/students
/students/123
/students?id=123
/students?email=foo@example.com
我尝试使用以下请求DTO来完成此任务:
[Route("/students", "GET")]
public class GetAllStudents : IReturn<StudentList>
{
}
[Route("/students", "GET")] // I want this to be for /students?Id=
[Route("/students/{Id}", "GET")]
public class GetStudentById : IReturn<Student>
{
public int Id …Run Code Online (Sandbox Code Playgroud) servicestack ×5
c# ×3
architecture ×2
.net ×1
dto ×1
json ×1
moq ×1
nservicebus ×1
rest ×1
rpc ×1
servicebus ×1
testing ×1
url-routing ×1
wcf ×1