1

我们在 Web 托管 API 服务中使用 ServiceStack,并且已经这样做了一段时间。任何请求的执行路径都遵循以下模式:

请求进来:

--> 服务(处理请求,利用通过构造函数注入的 IManager)

--> IManager(执行业务逻辑,利用通过构造函数注入的 IRepository/ies)

--> IRepository/ies (SQL Server, NoSQL, 利用构造函数注入的连接工厂/ies)

现在我们正在招待另一个客户,其中一些请求需要遵循稍微不同的业务逻辑,并可能使用不同的 repo 策略。但是,API 将保持一致。为此,我将客户端特定的逻辑(上面的具体 IManager 和 IRepository 实现)提取到单独的程序集中。我编写了一个组件来检查当前请求上下文,识别该请求所针对的客户端,然后使用反射和激活器来实例化我想要为任何给定请求执行的特定实现的实例。

但是,正因为如此,我不能只在启动时在容器中注册 IManager 和 IRepository 的实现——这需要根据请求动态解决。我想做某种类型的 LazyResolve,但我找不到任何可靠的例子来说明如何让我从这里开始。

我在这里想疯了吗?我的 API 基本上就是这样 - 发生的自定义逻辑与在运行时调用的客户端特定程序集隔离。这一切在理论上对我来说都是完全合理的,但在实践中它被证明是一个挑战。想法?想法?

4

1 回答 1

1

如果您只想在运行时解决临时依赖项,您可以根据服务中的需要从 IOC 解决它们:

base.TryResolve<T>();

在任何过滤器IRequest中:

req.TryResolve<T>();

或在 ServiceStack 外部使用:

HostContext.TryResolve<T>();
于 2018-06-27T23:14:16.017 回答