c# - 无法解决 IServerSideEvents 依赖关系
问题描述
扩展:IServerSideEvents 的 IOC 注入
我正在尝试在需要 IServerSideEvents 的容器上设置一个 Singleton(IMessager 具有依赖性)。
// setup Engine
List<IFileHandler> handler = new List<IFileHandler>() { new FileHandler() };
var engine = new Engine(handler, new List<IFileConverter>());
engine.Fail += container.Resolve<IMessager>().Error;
container.AddSingleton<Engine>(engine);
这是因为我需要在多个控制器中绑定相同的事件,但这些事件位于外部库中。我可以在注入控制器时很好地绑定它们,但试图让 IOC 处理它是行不通的,返回与上面相同的错误。
我想这是一个加载顺序问题,当我试图解决依赖关系时,插件尚未加载。这是在 Configure(Container container) 方法中尝试的
解决方案
请阅读.NET Core Container Adapter部分:
任何在 .NET Core Startup 中注册的依赖项也可用于 ServiceStack,但在 ServiceStack 的 IOC 中注册的依赖项仅对 ServiceStack 可见。
因此,如果您需要对 ServiceStack 和外部 ASP.NET Core 功能(如 MVC)都可用的依赖项,则需要在Startup.ConfigureServices()
.
插件
从您的链接:
public override void Configure(Funq.Container container)
{
var serverEventsFeature = new ServerEventsFeature();
// bind server events
serverEventsFeature.Register(this);
container.AddSingleton(new Engine(container.Resolve<IServerEvents>()));
}
永远不要像这样直接调用插件,它们应该在 Plugins 集合中注册:
Plugins.Add(new ServerEventsFeature());
插件在Configure()
运行后注册,如果您想注册一个使用IServerEvents
注册的依赖项,ServerEventsFeature
您需要使用工厂函数注册您的依赖项,即:
container.AddSingleton<ICacheClient>(c =>
new Engine(c.Resolve<IServerEvents>()));
或者,您可以注册一个AfterInitCallbacks
在 AppHost 初始化结束时运行的单例实例,例如:
AfterInitCallbacks.Add(host => {
container.AddSingleton<ICacheClient>(
new Engine(c.Resolve<IServerEvents>()));
});
如果你想注册一个任何其他插件注册的单例,你可以让你的插件实现 IPostInitPlugin,它AfterPluginsLoaded()
在所有插件注册后运行:
public class MyPlugin : IPlugin, IPostInitPlugin
{
public void Register(IAppHost appHost) {}
public void AfterPluginsLoaded(IAppHost appHost)
{
appHost.GetContainer().AddSingleton<ICacheClient>(c =>
new Engine(c.Resolve<IServerEvents>()));
}
}
推荐阅读
- hadoop-yarn - 如何在 Yarn ApplicationMaster 代码中获取所有正在运行的容器?
- amazon-web-services - 单一管理员的 Cognito 用户池
- ruby-on-rails - 如何查询具有 ActiveStorage 附件的记录?
- nlp - 如何在聊天机器人中实现本体?
- mysql - 我想在 docker 容器中创建一个 MySql 数据库,并在容器启动时在其中执行一些 DDL 和 DML 语句
- php - 错误 org.json.JSONException:在字符 0 处输入结束
- data-structures - 如何在队列和堆栈的帮助下对双向链表进行排序?
- angularjs - 嵌套的 ng-repeat 未显示正确的值
- java - Dagger 2 无法进行构造函数注入
- c# - 如何使用 ajax 将动态表加载到 Razor 页面