Использование ServiceStack Funq IoC: как вводятся зависимости?

У меня есть приложение WinForm, и я хочу использовать механизм внедрения зависимостей ServiceStack:

public class AppHost : AppHostBase
{
    public AppHost()
        : base("MyName", typeof(AppHost).Assembly)
    {
    }

    public override void Configure(Container container)
    {
        container.RegisterAutoWiredAs<AppApplicationContext, IAppApplicationContext>();
    }
}

Тогда в некотором классе используйте его:

public class SomeClass : AppBaseForm
{
    public IAppApplicationContext AppApplicationContext { get; set; }

    public SomeClass(IAppApplicationContext appApplicationContext)
    {
        AppApplicationContext = appApplicationContext;
    }

    public SomeClass()
    {
    }
}

Но AppApplicationContext всегда null, Когда в конструкторе без параметров я пишу:

AppApplicationContext = AppHostBase.Resolve<IAppApplicationContext>();

тогда все в порядке. Но так ли это правильно? Я имею в виду, что AppApplicationContext не должен разрешаться IoC автоматически? И WinForm должен иметь конструктор без параметров.

Остальной код:

private static void Main()
{
    var appHost = new AppHost();
    appHost.Init();
}

public interface IAppApplicationContext
{
}

public class AppApplicationContext : IAppApplicationContext
{
}

1 ответ

Решение

Вам нужно позвонить AutoWire чтобы контейнер вводил зависимости. Вы можете использовать его в своем приложении WinForm следующим образом:

public class SomeClass : AppBaseForm
{
    public IAppApplicationContext AppApplicationContext { get; set; }

    public SomeClass()
    {
        // Tell the container to inject dependancies
        HostContext.Container.AutoWire(this);
    }
}

Когда вы используете обычный сервис ServiceStack, AutoWire происходит за кулисами во время конвейера запросов, когда ServiceStack создает экземпляры вашей службы.

Я создал полностью рабочий пример здесь. Примечание. Демонстрация - это просто консольное приложение, а не WinForms, но показывает, что IoC используется вне службы ServiceStack, и работает не иначе.

Другие вопросы по тегам