servicestack的基础学习之路

Servicestack的解决方案的结构:
1.xxxx.Tests
说明:单元测试使用
2.xxxx.ServiceModel
说明:Poco和Dto和响应的类的存放地址
3.xxx.serviceinterface(服务层)
说明:存放myservice类:服务层—负责接收请求返回响应,是业务逻辑层和Model 合耦的地方
4.xxxx
说明:存放全局变量的地方,一般不修改

业务逻辑层就新建类库,自行添加

更详细的说明:

Apphost项目
Host项目包含您的AppHost,它在IOC中引用并注册所有App的具体依赖项,并且是维护所有App配置和全局行为的中心位置。它还引用了需要与App一起部署的所有Web资产,如Razor Views,JS,CSS,Images,Fonts等。AppHost是顶级项目,它引用您的应用程序使用的所有依赖项,其角色类似于协调程序和管道,它决定哪些功能可用以及使用哪些具体实现。通过设计,它引用所有其他(非测试)项目,而没有任何引用它,并且目标应该保持免于任何应用程序或业务逻辑。

ServiceInterface项目
ServiceInterface项目是所有业务逻辑和服务的实现项目,通常引用除Host项目之外的所有其他项目。Small和Medium项目可以在此处维护所有实现,其中逻辑可以在功能文件夹下进行分组。大型解决方案可以将此项目拆分为更易于管理的内聚和模块化项目,我们还建议将其包含在可能使用的任何依赖项中。

ServiceModel项目
ServiceModel项目包含所有应用程序的DTO,它们定义了您的服务合同,使它们与任何服务器实现隔离,就是您的服务能够如何封装其功能并使它们在远程外观后面可用。每个解决方案应该只有一个ServiceModel项目,其中包含所有DTO,并且应该是实现,依赖和无逻辑,因为服务合同与实现分离,强制实现互操作性,确保您的服务不强制要求特定的客户端实现,并确保这是只有项目客户端需要能够通过直接引用ServiceModel.dll或使用Add ServiceStack Reference从远程ServiceStack实例下载DTO 来调用任何服务:

简单的实现:
//module层的实体类
namespace servicestacktest.ServiceModel
{
[Route("/mayang/", “GETS”)]

[Route("/mayang/{Name}","GETS")]
public class Student
{
    public string Name
    {
        get;
        set;
    }
}
//[Serializable]
//[DataContract]
public class StudentResponse
{
    
    public string Result
    {
        get;
        set;
    }
}

}
//服务层的实例化
namespace servicestacktest.ServiceInterface
{
public class MyServices : Service
{
//any表示接受任何形式的请求(get,post…)
//get只能接受get形式的请求,不能接受post的请求、post一样
public object Any(Hello request)
{
return new HelloResponse { Result = $“Hello, {request.Name}!” };
}
public object Get(Student request)
{
return new StudentResponse { Result = $“Hello, {request.Name}!” };
}
}
}
这样就完成根据路由进行的响应,这样仔细想想,业务逻辑层调用数据访问层,然后再在服务层里调用业务逻辑层,实例化出对象,操作后return就可以了

业务逻辑层的moudle
获取http
namespace servicestack_bll
{
public class GetStudet
{
HttpRequest http = null;
public string Cookie { get; set; }
public string Url { get; set; }
public GetStudet(HttpRequest http)
{
var httpcontext = http;
Cookie = http.Url.ToString();
Url = http.Url.ToString();
}

}

}
业务逻辑层接收了前端发过来的http请求
然后在service层进行响应
public object Post(Student request)
{
//var httpcontext = HttpContext.Current.Request;
GetStudet stu = new GetStudet(HttpContext.Current.Request);
return new basicResponse(true,“mamamam”,stu);
}
这个basicResponse是一个通过泛型构造的基础响应类
namespace servicestacktest.ServiceModel
{
public class basicResponse
{
public Boolean Success { get; set; }
public string Message { get; set; }
public T Data { get; set ; }
public List Asss
{
get;
set;
}

    public basicResponse(bool x, string message,T data)
    {
        this.Data = data;
        this.Success = x;
        this.Message = message;
        //this.Asss = students;
    }

    public basicResponse()
    {

    }
}

}
因为泛型,可以封装数据传输,更方便,很多地方也可以再加个List
再说一下数据访问层,modle里面的实体类和数据库一定是一一对性的,因此需要c#中的特性对我们进行更多的扩展,
///
/// 学生ID(主键)
///
[CustomField(“CHAR(30)”)]
[PrimaryKey]
public string Id { get; set; }

///
/// 学生院系(外键)
///
[CustomField(“CHAR(30)”)]
[ForeignKey(typeof(Department), OnDelete = “NULL”, OnUpdate = “CASCADE”)]
public string Department { get; set; }
还有servicestack中的拦截器,放在serviceinterface下
namespace servicestacktest.ServiceInterface
{
public class qjbjicheng : RequestFilterAttribute
{
public override void Execute(IRequest req, IResponse res, object requestDto)
{
var acount= req.FormData[0];
var password = req.FormData[1];
if(acount==“123”&&password==“123”)
{
return ;
}
else
{
return ;
}
}
}
}
用特性放在需要拦截操作的类或方法前

OrmLite操作数据库
class Program
{
static void Main(string[] args)
{
var _sqlserverFla = new OrmLiteConnectionFactory(“data source=.;initial catalog=demo1;user id=sa;password=123456;”, SqlServer2008OrmLiteDialectProvider.Instance);
//打开数据库连接
using (var db = _sqlserverFla.Open())
{
//model字段要和sql语句返回的字段相对应
//var _aqiDayLst = db.Select < “对象的model” > (“sql语句”);
//db的执行 db.Insert<>,能执行数据的插入等操作
db.DropAndCreateTable();
db.DropAndCreateTable();
db.DropAndCreateTable();
db.DropAndCreateTable ();
db.DropAndCreateTable();
}
}
}
Ormlite将数据库封装很好,因此仅需调用几个方法就可用实体类在数据库中创建出来具体的表

使用框架中一些需要注意的地方

读数据库要加try catch,防止程序中断
(日志:https://blog.csdn.net/xiangnideshen/article/details/45894631)
Catch加日志,记录运行(使用Stacktrace处理异常
)https://blog.csdn.net/u012585964/article/details/51772622)

反射中的属性getfieldinfo可以找到pro找不到的属性

存数据库和向前端传输数据要加密

学长补充:
servicestack
路由特性
[Route("/customers", “GET”)]
指明url路径,并选择访问方式,一个request可以有多个route
自己声明特性
servicestack的拦截器需要继承RequestFilterAttribute这个类
并且实现public override void Execute(IRequest req, IResponse res, object requestDto)这个方法
req代表请求的所有数据
例如
如果是使用post传参,且参数在formdata中
string account = req.FormData[0];
string password = req.FormData[1];
如果是get传参,
我忘了,请百度
string useragent = req.UserAgent;
var cookie = req.Cookies;
附录,此方法的常用属性及方法,同样适用于httpcontext
Application 为当前 HTTP 请求获取 HttpApplicationState 对象。
Cache 获取当前应用程序域的 Cache 对象。
Current 为当前 HTTP 请求获取或设置 HttpContext 对象。
CurrentHandler 获取表示当前正在执行的处理程序的 IHttpHandler 对象。
Handler 获取或设置负责处理 HTTP 请求的 IHttpHandler 对象。
Items 获取可用于在 HTTP 请求过程中在 IHttpModule 接口和 IHttpHandler 接口之间组织和共享数据的键/值集合。
PreviousHandler 获取父处理程序的 IHttpHandler 对象。
Profile 获取当前用户配置文件的 ProfileBase 对象。
Request 为当前 HTTP 请求获取 HttpRequest 对象。
Response 为当前 HTTP 响应获取 HttpResponse 对象。
Server 获取提供用于处理 Web 请求的方法的 HttpServerUtility 对象。
Session 为当前 HTTP 请求获取 HttpSessionState 对象。
SkipAuthorization 获取或设置一个值,该值指定 UrlAuthorizationModule 对象是否应跳过对当前请求的授权检查。
Timestamp 获取当前 HTTP 请求处理请求的时间点
  方法
AddError 将异常添加到当前 HTTP 请求的异常集合中。
ClearError 清除当前 HTTP 请求的所有错误。
GetGlobalResourceObject 已重载。 获取应用程序级别的资源。
GetLocalResourceObject 已重载。 获取页级别的资源。
GetSection 获取当前应用程序的默认配置的指定配置节。
RemapHandler 用于为请求指定处理程序。
RewritePath 重写路径,以便后续的 Asp.net以为这是才是真正的地址。RewritePath用在无 Cookie 会话状态中。
servicestack.ormlite
声明下面属性的值的大小
[CustomField(“CHAR(30)”)]
声明下面属性为主键
[PrimaryKey]
声明下面是外键,并指定外键的属性
[ForeignKey(typeof(Major), OnDelete = “SET NULL”, OnUpdate = “CASCADE”)]
c#
数据契约
[DataContract]
服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型。
一旦声明一个类型为DataContract,那么该类型就可以被序列化在服务端和客户端之间传送。
[DataMember]
只有声明为DataContract的类型的对象可以被传送,且只有成员属性会被传递,成员方法不会被传递。WCF对声明为DataContract的类型提供更加细节的控制,可以把一个成员排除在序列化范围以外,也就是说,客户端程序不会获得被排除在外的成员的任何信息,包括定义和数据。默认情况下,所有的成员属性都被排除在外,因此需要把每一个要传送的成员声明为DataMember;
可序列化的
[Serializable]
表明该对象可以被序列化

发布了43 篇原创文章 · 获赞 8 · 访问量 3932

猜你喜欢

转载自blog.csdn.net/MaYang_/article/details/100748276