使用ServiceStack设计Web应用程序

时间:2013-02-16 13:07:00

标签: asp.net-mvc servicestack n-tier-architecture

获得有关在我的asp.net MVC网站上使用ServiceStack的建议 (Maintaining state in Asp.Net MVC website),我开始在我的项目中实现它 - 但有些东西对我来说仍然不清楚。

目前我有两个项目:一个是asp.net MVC项目,另一个是BL项目(一个包含所有业务逻辑的类库)。 MVC项目中的所有控制器都调用BL项目中的类/函数。
目前,mvc项目加载BL的DLL,但是在将来网站增长时,BL的项目将在不同的机器上运行。

我想使用ServiceStack进行会话管理/缓存和身份验证(这两者通常都相互依赖)。

我的问题:
1)如果没有基于消息的Web服务的功能,是否可以仅使用这两个功能?需要初始化ServiceStack,并且在初始化两次时(在两个项目中)都会抛出错误。
2)是否可以在两个项目之间拆分ServiceStack的实现?我想使用ServiceStack的身份验证提供程序在BL项目中维护身份验证过程,但是我自己(或在ServiceStack的帮助下)在mvc项目中处理所有UI / cookie。
3)我想在BL项目中使用ServiceStack的缓存,但我想我仍然需要维护一些会话cookie来接收会话ID。做正确的方法是什么?是否有用于此目的的内置辅助函数?

提前谢谢!

2 个答案:

答案 0 :(得分:5)

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应用程序或服务的设置。

然而,您可以跨多个程序集拆分服务的实现,并让ServiceStack通过在AppHostBase构造函数中指定它们来扫描它们,例如:

public class AppHost : AppHostBase 
{
   public AppHost() : base("My Service", 
     typeof(AServiceInDll1).Assembly, typeof(AServiceInDll2).Assembly/*, etc.*/){}
}

2)续我想使用ServiceStack的身份验证提供程序在BL项目中维护身份验证过程,但是我自己(或在ServiceStack的帮助下)在mvc项目中处理所有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,它们被自动指示在客户端上添加(由服务器提供)无论何时访问会话。

如果您不希望业务逻辑服务依赖于ASP.NET System.Web,我建议访问并保存要在控制器中完成的会话并将其传递给业务逻辑。

我建议您阅读Sessions Wiki Page以获取有关ServiceStack会话如何运作的更多背景信息。

在ServiceStack与ASP.NET或MVC

之间集成ASP.NET上下文

我将添加此信息,因为它对于在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();

答案 1 :(得分:2)

不确定我是否完全掌握了您的问题以及您希望如何在多台服务器之间拆分项目。我会尽力回答你的问题......

如果没有基于消息的Web服务的功能,是否可以仅使用这两个功能?需要初始化ServiceStack,并在初始化两次时抛出错误

您似乎尝试在一个解决方案中运行2个ServiceStack实例(甚至可能是2个网站)(一个在您的Web项目中,一个在您的BL层中)。我不认为这是可能的。您的BL层可以共享ServiceStack库,您可以在Web项目中配置(在AppHost.Configure方法中)引用您的BL项目的那些库。

是否可以在两个项目之间拆分ServiceStack的实现?

我认为答案是肯定的,但两个项目都会使用一个ServiceStack实例。这将在项目中共享会话状态。可能有一种方法可以让两个项目拥有自己的ServiceStack实例...请参阅https://github.com/ServiceStack/ServiceStack/wiki/Self-hosting

我想在BL项目中使用ServiceStack的缓存,但我想我仍然需要维护一些会话cookie来接收会话ID。 如果跨两个项目使用ServiceStack,您可以访问UserSession(https://github.com/ServiceStack/ServiceStack/wiki/Sessions)中的所有会话数据。如果MVC控制器继承自ServiceStackController,则可以使用SessionFeature.GetSessionId()来获取会话ID。在ServiceStack Service(实现Service的类)中,您可以使用base.Session获取会话数据。

希望这有帮助。