asp.net-mvc - 使用 ServiceStack 设计 Web 应用程序

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

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

目前我有两个项目:一个是 asp.net MVC 项目,另一个是 BL 项目(一个包含所有业务逻辑的类库)。
MVC 项目中的所有 Controller 都会调用 BL 项目中的类/函数。

目前,mvc项目加载了BL的DLL,但将来网站发展壮大时,BL的项目将运行在不同的机器上。

我想使用 ServiceStack 进行 session 管理/缓存和身份验证(它们通常相互依赖)。

我的问题:
1) 如果没有基于消息的 Web 服务功能,是否可以仅使用这两个功能? ServiceStack 需要初始化,并且在初始化两次(在两个项目中)时会引发错误。

2)是否可以在两个项目之间拆分ServiceStack的实现?我想在 BL 项目中使用 ServiceStack 的身份验证提供程序来维护身份验证过程,但在 mvc 项目中由我自己(或在 ServiceStack 的帮助下)处理所有 UI/cookie。

3)我想在BL项目中使用ServiceStack的缓存,但我想我仍然需要维护一些 session cookie来接收 session id。正确的方法是什么?为此目的是否有任何内置的辅助函数?

提前致谢!

最佳答案

1) 如果没有基于消息的 Web 服务功能,是否可以仅使用这两个功能? ServiceStack 需要初始化,并且在初始化两次(在两个项目中)时会引发错误。

如果您安装最新的 ServiceStack.Mvc NuGet 包,您将获得基础 ServiceStackController这是一个 MVC Controller ,可以方便地访问 ServiceStack 的内置提供程序。尽管您仍然需要使用所需的依赖项自动连接 Controller ,例如注入(inject)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的缓存,但我想我仍然需要维护一些 session cookie来接收 session id。正确的方法是什么?为此目的是否有任何内置的辅助函数?

您可以使用任何 ServiceStack's Caching providers就像任何其他 C# 类一样,即将您的业务逻辑绑定(bind)到 ICacheClient并在您的 IOC 中注入(inject)具体实现。

对于 session ,您可以使用 base.SessionAs<T> ServiceStack.Mvc 中的方法 ServiceStackController访问 session 。要保存 session ,您可以使用 IHttpRequest.SaveSession()扩展方法。尽管这两种方法都需要 ASP.NET 上下文(如果没有提供,它使用 ASP.NET 的 HttpContext 单例)才能工作,因为它依赖于 ServiceStack 的 ss-id/ss-pid。每当您访问 Session 时,会自动指示(由服务器)将 cookie 添加到客户端。

如果您不希望您的业务逻辑服务依赖于 ASP.NET 的 System.Web我建议访问和保存要在您的 Controller 中完成的 session 并传递给您的业务逻辑。

我建议阅读 Sessions Wiki Page有关 ServiceStack session 如何工作的更多背景信息。

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();

关于asp.net-mvc - 使用 ServiceStack 设计 Web 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14910624/

相关文章:

c# - 如何模仿 LabelFor 的 aspnet mvc 代码?

asp.net-mvc - 如何从 url : asp.net mvc 隐藏操作和 Controller

c# - ServiceStack 不会自动连接和注册 AppSettings

redis - 如何使用错误处理程序重新连接到 StackServices.RedisMqServer 中的重新分发服务器?

architecture - 设计一个通用的作业调度程序

c# - 在没有 html 注入(inject)的情况下包装到 anchor 标记 2.5 M

javascript - session 结束时调用操作方法

servicestack - 基于类接口(interface)的自定义ormlite查询实现

validation - 验证应该针对业务模型还是 View 模型?

C++ 和多层架构