我有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>();
然后一切都好。但这是正确的方法吗?我的意思是IoC不应该自动解决AppApplicationContext?并且WinForm必须具有无参数构造函数。
其余代码:
private static void Main()
{
var appHost = new AppHost();
appHost.Init();
}
public interface IAppApplicationContext
{
}
public class AppApplicationContext : IAppApplicationContext
{
}
答案 0 :(得分:8)
您需要调用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创建服务实例时在请求管道中发生在幕后。
我创建了一个fully working example here。 注意:该演示只是一个控制台应用程序,而不是WinForms,但它确实显示了在ServiceStack服务之外使用的IoC,它的工作方式没有区别。