Не удается разрешить с зависимостью IServerSideEvents - PullRequest
2 голосов
/ 21 мая 2019

Расширение: IOC-инъекция IServerSideEvents

Я пытаюсь настроить Singleton на контейнере, который требует 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 обработать его не будет работать, возвращает ту же ошибку, что и выше.

Я предполагаю, что это проблема порядка загрузки, и когда я пытаюсь разрешить зависимость, плагины еще не загружены.Это выполняется в методе Configure (Контейнер-контейнер)

1 Ответ

1 голос
/ 21 мая 2019

Ознакомьтесь с разделом .NET Core Container Adapter :

любые зарегистрированные зависимости .NET Core Startup также доступны для ServiceStack, но зависимости, зарегистрированные в IOC ServiceStack, видны только для ServiceStack.

Поэтому, если вам нужны зависимости, доступные как для ServiceStack, так и для внешних функций ASP.NET Core, таких как MVC, вам необходимо зарегистрировать их в вашем 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.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>()));
    }
}
...