我有一个看起来像这样的服务:
public class StuffService : ServiceStack.Service
{
private IStuffHandler _handler;
public StuffService(IStuffHandler handler)
{
_handler = handler;
}
public void Post(RequestMessage message)
{
_handler.HandleIt();
}
}
在StuffService中,_handler应该被实例化为以下类:
public class StuffHandler : IStuffHandler
{
public void HandleIt()
{
//do stuff
}
}
在一个单独的文件中:
public class ServiceAppHost : AppHostHttpListenerBase
{
public ServiceAppHost() :
base("CoolConnectionString", typeof(ServiceAppHost).Assembly)
{
}
public override void Configure(Container container)
{
this.Plugins.Add(new SwaggerFeature());
container.RegisterAs<IStuffHandler, StuffHandler>();
}
}
static void Main(string[] args)
{
ServiceAppHost appHost = new ServiceAppHost();
appHost.Init();
appHost.Start("http://localhost:7894/");
Console.Read();
}
现在,我无法弄清楚如何将IStuffHandler设置为StuffHandler的实例。我在官方ServiceStack文档页面上关注了this page。我在该链接页面上尝试了几种不同的方法,但我无法让ServiceStack将_handler实例化为StuffHandler实例。我需要做什么?
答案 0 :(得分:4)
DependencyInjection需要它可以注入依赖项 - 在你的情况下没有办法,私有字段是要设置的。
您需要一个构造函数,它接受您的DI容器支持的IStuffHandler
或其他一些公共方法/字段/属性。
在你的startmethod中你必须调用像container.resolve<MyService>()
这样的东西来从容器中获取一个实例。
答案 1 :(得分:2)
您的依赖注册顺序错误,应该是:
container.RegisterAs<StuffHandler, IStuffHandler>();
另一种注册方法是使用container.Register:
注册类似这样的类型的实例container.Register<IStuffHandler>(c => new StuffHandler());
在您的服务中,依赖项由公共属性:
注入public class StuffService : ServiceStack.Service
{
public IStuffHandler Handler { get; set; }
public void Post(RequestMessage message)
{
Handler.HandleIt();
}
}
或通过构造函数:
public class StuffService : ServiceStack.Service
{
private IStuffHandler _handler;
public StuffService(IStuffHandler handler)
{
_handler = handler;
}
public void Post(RequestMessage message)
{
_handler.HandleIt();
}
}
这些示例中的任何一个都会将您的依赖项注入您的服务中。