- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我一直在评估 ServiceStack,到目前为止,我几乎被说服了 - 但我有一个要求,我认为将成为一个交易破坏者。
我基本上需要多个 AppHost 派生实例。第一个很好地启动,但其余的失败,因为“AppHostBase.Instance 已经设置”。
这是否意味着如果我想要多个主机(在不同的 Uris 上)位于不同的可执行文件中?如果是这样,那就太令人失望了,因为除了这个限制之外,这个库在所有其他方面都是完美的。
如果我错了,谁能指出解决方案?
请允许我详细说明一下。我们计划在整个网络中提供许多服务。我的意图是将它们设计为单独的服务,然后“托管”在托管类中。托管类本身是一种用于管理目的的服务,具有启动和停止服务的能力。它们在网络上是“可发现的”。我们可以在不同时间或随意在不同机器上启动和关闭服务。
我的计划是为这些事情中的每一个都使用服务堆栈,并能够在任何机器和任何“主机”中以临时方式创建和销毁服务。我唯一遇到的问题是 AppHost 只被初始化一次。
显然我做错了什么,所以任何关于如何在同一个可执行文件中托管多个服务的信息都会很棒 :)
最佳答案
为了回答这个问题,我添加了新的 Modularizing services和 Physical project structure wiki 页面突出显示构建和模块化 ServiceStack 服务的不同方式,我将重复这些方式以提高可发现性:
正如您所发现的,ServiceStack 为每个应用程序域都有一个单个应用程序主机。正如您可能从名称中推断出的那样,Host 项目的作用是成为绑定(bind)所有服务具体依赖项、插件、过滤器和您的服务需要的所有其他内容的管道。在您的 AppHost.Configure()
方法中初始化所有内容后,您的服务配置应该是不可变的。 Physical project structure wiki page wiki 展示了典型解决方案的推荐物理项目结构。
虽然您只能拥有 1 个 AppHost,但可以通过在 AppHostBase 构造函数中提供程序集来将服务分布在多个程序集中,例如:
public class AppHost : AppHostBase
{
//Tell Service Stack the name of your application and which assemblies to find your web services
public AppHost() : base("Hello ServiceStack!",
typeof(ServicesFromDll1).Assembly, ServicesFromDll2).Assembly /*, etc */) { }
public override void Configure(Container container) {}
}
您还可以通过覆盖 CreateServiceManager
来提供自己的策略来发现和解析 ServiceStack 应该自动连接的服务类型,例如:
public class AppHost : AppHostBase
{
public AppHost() : base("Hello ServiceStack!", typeof(ServicesFromDll1).Assembly) { }
public override void Configure(Container container) {}
//Provide Alternative way to inject IOC Container + Service Resolver strategy
protected virtual ServiceManager CreateServiceManager(params Assembly[] assembliesWithServices)
{
return new ServiceManager(new Container(),
new ServiceController(() => assembliesWithServices.ToList().SelectMany(x => x.GetTypes())));
}
}
模块化服务的一种方法是将它们封装在 Plugins 中它允许您手动注册服务、自定义路由、过滤器、内容类型,允许自定义以及您的模块需要的任何其他内容。
为了说明这一点,我们将展示什么是基本 Auth Feature示例可能如下所示:
public class BasicAuthFeature : IPlugin
{
public string HtmlRedirect { get; set; } //User-defined configuration
public void Register(IAppHost appHost)
{
//Register Services exposed by this module
appHost.RegisterService<AuthService>("/auth", "/auth/{provider}");
appHost.RegisterService<AssignRolesService>("/assignroles");
appHost.RegisterService<UnAssignRolesService>("/unassignroles");
//Load dependent plugins
appHost.LoadPlugin(new SessionFeature());
}
}
所有内容都封装在一个插件中,您的用户可以通过以下方式在您的 AppHost 中轻松启用它们:
Plugins.Add(new BasicAuthFeature { HtmlRedirect = "~/login" });
查看此 earlier answer关于项目物理布局的推荐方法。
关于c# - ServiceStack AppHost 是单例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15850226/
我在尝试使用 this.SessionAs 时遇到以下异常在我的一项服务中: "AppHost does not support accessing the current Request via a
我一直在评估 ServiceStack,到目前为止,我几乎被说服了 - 但我有一个要求,我认为将成为一个交易破坏者。 我基本上需要多个 AppHost 派生实例。第一个很好地启动,但其余的失败,因为“
我对如何使服务程序集可插入(从配置文件中读取它们)到 ServiceStack 有疑问。 我想从配置文件注册我的服务程序集,而不是在 AppHost 中硬编码它们。像这样的构造函数: public a
我想在不使用 MVC 的情况下将 ServiceStack 用作纯 AppHost 实现。我想用它来驱动单页应用程序。 为 SPA 的单个 HTML shell 页面提供服务非常简单,我发现了很多这样
我想知道 ServiceStack 注册路由的最佳实践是什么。 在 AppHost 中使用 Routes.Add 定义路由 在 DTO 上使用 RouteAttiribute 装饰器定义路由 我读过一
看起来只有请求 dto 和异常对象可以在 AppHost 的 ServiceExceptionHandler 中使用。我需要访问 IHttpRequest 对象,以便我可以访问 Items 集合并获取
我正在尝试在 C# 代码中设置 IP 地址和域限制,我正在关注 this文章,但它给了我无法识别的位置错误。 Error: Unrecognized configuration path 'MACHI
我们有一个实用程序,可以在安装到客户服务器上时自动设置 ASP.NET Web 应用程序。此实用程序通常会在 applicationHost.config 中为新应用的位置路径添加许多配置。我们使用
我编写了一个使用 gmail 发送邮件的程序,如果我单独执行它,它工作正常,但是当我与 google appengine 集成时,它给我以下错误, Exception in thread "main"
我是一名优秀的程序员,十分优秀!