1) 是否可以仅使用这两个功能而不使用基于消息的 Web 服务功能? ServiceStack 需要初始化,并且在初始化两次时(在两个项目中)都会引发错误。
如果您安装最新的ServiceStack.Mvc NuGet 包,您将获得基本的ServiceStackController,它是一个 MVC 控制器,可方便地访问 ServiceStack 的内置提供程序。尽管您仍然需要使用所需的依赖项自动连接控制器,例如一个注入的ICacheClient。
尽管您不使用 ServiceStack 的 WebFramework,但拥有一个 AppHost 是注册您的依赖项的一个方便的地方。 ServiceStack 是由ASP.NET's IHttpHandler mappings specified in the Web.config 触发的,所以如果你没有任何指定的映射,ServiceStack 永远不能被外部调用,但注册的依赖仍然可以在内部被访问:
var cache = AppHost.Resolve<ICacheClient>(); //Get ICacheClient for SS IOC
2) 是否可以在两个项目之间拆分ServiceStack的实现?
如果你有一个 AppHost,你不能在一个宿主项目中拥有多个实例(根据设计),因为 AppHost 应该类似于一个宿主项目,你的所有服务依赖项都应该在其中注册以及适用于整个 Web 应用程序或服务的配置设置。
但是,您可以将服务的实现拆分到多个程序集中,并通过在 AppHostBase 构造函数中指定它们让 ServiceStack 扫描它们,例如:
public class AppHost : AppHostBase
{
public AppHost() : base("My Service",
typeof(AServiceInDll1).Assembly, typeof(AServiceInDll2).Assembly/*, etc.*/){}
}
2) 续。我想在 BL 项目中使用 ServiceStack 的身份验证提供程序来维护身份验证过程,但在 mvc 项目中由我自己(或在 ServiceStack 的帮助下)处理所有 UI/cookie。
查看ServiceStack.UseCases CustomAuthenticationMvc 示例项目,了解使用 MVC 但使用 ServiceStack 进行身份验证的示例。
3)我想在BL项目中使用ServiceStack的缓存,但我想我仍然需要维护一些会话cookie来接收会话id。正确的方法是什么?有没有为此目的的内置辅助函数?
您可以像使用任何其他 C# 类一样使用任何 ServiceStack's Caching providers,即将您的业务逻辑绑定到 ICacheClient 并将具体实现注入您的 IOC。
对于会话,您可以使用 ServiceStack.Mvc ServiceStackController 中的 base.SessionAs<T> 方法来访问会话。要保存会话,您可以使用 IHttpRequest.SaveSession() 扩展方法。尽管这两种方法都需要 ASP.NET 上下文(如果未提供,它使用 ASP.NET 的 HttpContext 单例)才能工作,因为它依赖于 ServiceStack 的 ss-id/ss-pid cookie,这些cookie 会自动指示添加到客户端(由服务器),只要您访问会话。
如果您不希望您的业务逻辑服务依赖于 ASP.NET 的 System.Web,我建议您访问并保存要在您的控制器中完成并传递给您的业务逻辑的会话。
我建议阅读Sessions Wiki Page,了解有关 ServiceStack 会话如何工作的更多背景信息。
ServiceStack 与 ASP.NET 或 MVC 之间的 ASP.NET Context 集成
我将添加此信息,因为它对于在 ServiceStack 和 ASP.NET 或 MVC 之间进行高级集成的任何人都很有用,因为 ServiceStack 的一些扩展方法依赖于这些内置类型。
您可以使用以下命令创建 ServiceStack IHttpRequest 或 IHttpResponse(在任何 HTTP/Controller 请求中):
var ssHttpRequest = System.Web.HttpContext.Current.Request.ToRequest();
var ssHttpResponse = System.Web.HttpContext.Current.Response.ToResponse();
最后你可以创建一个完整的请求上下文(封装了 IHttpRequest 和 IHttpResponse):
var ssRequestContext = System.Web.HttpContext.Current.ToRequestContext();