【发布时间】:2017-06-11 19:06:06
【问题描述】:
我试图弄清楚每次我从容器中解析一个实例时如何获得一个新的生命周期范围。我想在不需要了解 Autofac 的依赖组件的情况下执行此操作。
我正在创建一个 .NET Core 服务器应用程序(控制台应用程序),它有一个“主服务器”(IMasterServer)组件和零个或多个“会话服务器”(ISessionServer)组件。主服务器和会话服务器都有自己的 IMessageBroker 依赖项。每当主服务器从消息代理收到消息时,它都会创建一个新的会话服务器。
问题是每个会话服务器实例都需要自己的IMessageBroker,我认为我不能使用InstancePerDependency(),因为ISessionServer 的其他子组件也需要访问IMessageBroker,所以消息代理需要是会话范围内的单个实例。所以我的想法是,当主服务器产生一个新会话时,它应该在新的生命周期内这样做,我可以使用 InstancePerLifetimeScope() 注册 IMessageBroker 依赖项。
所以,问题是,我如何将ISessionServer 工厂注入IMasterServer,这样每次调用该工厂时,都会为生成的ISessionServer 实例创建一个新的生命周期范围?以及如何做到这一点,使得所有组件都不需要了解 Autofac?
这两个 SO 问题都建议使用Owned<T> 关系:
Can I create an implicit Lifetime scope within a factory?
Is it possible to create a new scope whenever a component is resolved?
但是,除非我遗漏了什么,否则这意味着将要注入依赖项的组件(在我的例子中为 IMasterServer)需要了解 Autofac,因为它的 ctor 签名必须包含 Owned<T> 类型。
到目前为止我所拥有的:
using Autofac.Features.OwnedInstances;
class MasterServer : IMasterServer
{
private IMessageBroker mMessageBroker;
private Func<Owned<ISessionServer>> mSessionServerFactory;
public Master(
Func<string, IServerMessageBroker> messageBrokerFactory,
Func<Owned<ISessionServer>> sessionServerFactory
)
{
mMessageBroker = messageBrokerFactory("master");
mSessionServerFactory = sessionServerFactory;
}
}
class SessionServer : ISessionServer
{
private IMessageBroker mMessageBroker;
private string mId;
public SessionServer(
Func<string, IMessageBroker> messageBrokerFactory
)
{
mId = Guid.NewGuid().ToString();
mMessageBroker = messageBrokerFactory(mId);
}
}
您可以看到,MasterServer 具体类需要使用Autofac.Features.OwnedInstances 命名空间才能使用Owned<T> 关系类型定义会话工厂。
每次通过注入MasterServer 的工厂解析ISessionServer 时,我如何使用Autofac 创建一个新的生命周期范围,而不需要组件了解有关正在使用的特定DI 容器的任何信息?
【问题讨论】: