无法解决 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>()));
    }
}