无法使用IServerSideEvents依赖关系进行解析

时间:2019-05-21 13:47:51

标签: c# servicestack inversion-of-control

扩展: 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)方法中提示的

1 个答案:

答案 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>()));
    }
}