我试图在需要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容器适配器的部分:
注册的任何.NET Core Startup依赖项也可用于ServiceStack,但在ServiceStack的IOC中注册的依赖项仅对ServiceStack可见。
因此,如果您需要ServiceStack和MASP之类的外部ASP.NET Core功能都可用的依赖项,则需要在.NET中注册它们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>()));
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句