扩展: IOC injection of IServerSideEvents
我试图在需要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)方法中提示的
答案 0 :(得分:1)
请阅读.NET Core Container Adapter上的部分:
任何注册的.NET Core Startup依赖项也可用于ServiceStack,但在ServiceStack的IOC中注册的依赖项仅对ServiceStack可见。
因此,如果您需要ServiceStack和MASP之类的外部ASP.NET Core功能可用的依赖项,则需要在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集合中注册:
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>()));
});
如果您要注册其他任何插件都已注册的单例,则可以将您的插件注册到implement 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>()));
}
}