无法解决 IServerSideEvents 依赖
Cannot resolve with IServerSideEvents dependancy
延期时间:
我正在尝试在需要 IServerSideEvents 的容器上设置单例(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 处理它是行不通的,returns 与上面相同的错误。
我想这是一个加载顺序问题,当我试图解决依赖关系时,插件尚未加载。这是在 Configure(Container container) 方法中尝试的
请阅读 .NET Core Container Adapter 部分:
any dependencies registered .NET Core Startup are also available to ServiceStack but dependencies registered in ServiceStack’s IOC are only visible to ServiceStack.
因此,如果您需要 ServiceStack 和外部 ASP.NET 核心功能(如 MVC)都可用的依赖项,您需要在 Startup.ConfigureServices()
.
中注册它们
插件
来自你的link:
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.Add(new ServerEventsFeature());
插件在 Configure()
是 运行 之后注册,如果你想注册一个使用由 ServerEventsFeature
注册的 IServerEvents
的依赖项,你需要注册你的与工厂功能的依赖关系,即:
container.AddSingleton<ICacheClient>(c =>
new Engine(c.Resolve<IServerEvents>()));
或者,您可以在 AppHost 初始化结束时注册一个 AfterInitCallbacks
的单例实例 运行,例如:
AfterInitCallbacks.Add(host => {
container.AddSingleton<ICacheClient>(
new Engine(c.Resolve<IServerEvents>()));
});
如果您想注册任何其他插件注册的单例,您可以将您的插件添加到 implement IPostInitPlugin,在所有插件注册后 运行s 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>()));
}
}
延期时间:
我正在尝试在需要 IServerSideEvents 的容器上设置单例(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 处理它是行不通的,returns 与上面相同的错误。
我想这是一个加载顺序问题,当我试图解决依赖关系时,插件尚未加载。这是在 Configure(Container container) 方法中尝试的
请阅读 .NET Core Container Adapter 部分:
any dependencies registered .NET Core Startup are also available to ServiceStack but dependencies registered in ServiceStack’s IOC are only visible to ServiceStack.
因此,如果您需要 ServiceStack 和外部 ASP.NET 核心功能(如 MVC)都可用的依赖项,您需要在 Startup.ConfigureServices()
.
插件
来自你的link:
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.Add(new ServerEventsFeature());
插件在 Configure()
是 运行 之后注册,如果你想注册一个使用由 ServerEventsFeature
注册的 IServerEvents
的依赖项,你需要注册你的与工厂功能的依赖关系,即:
container.AddSingleton<ICacheClient>(c =>
new Engine(c.Resolve<IServerEvents>()));
或者,您可以在 AppHost 初始化结束时注册一个 AfterInitCallbacks
的单例实例 运行,例如:
AfterInitCallbacks.Add(host => {
container.AddSingleton<ICacheClient>(
new Engine(c.Resolve<IServerEvents>()));
});
如果您想注册任何其他插件注册的单例,您可以将您的插件添加到 implement IPostInitPlugin,在所有插件注册后 运行s 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>()));
}
}