无法在服务中注入依赖性

时间:2016-02-15 15:33:00

标签: c# servicestack

我有一个看起来像这样的服务:

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实例。我需要做什么?

2 个答案:

答案 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();
    }
}

这些示例中的任何一个都会将您的依赖项注入您的服务中。