Использование 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, и работает не иначе.