4

我正在使用服务堆栈,但我不能(或者我不知道如何使用构造函数创建服务类)。

这是我所做的:

public class AppHost : AppSelfHostBase
{
    public AppHost()
        : base("ClientService", typeof(ClientService).Assembly)
    {
    }

    public override void Configure(Container container)
    {
    }
}


public class Context : ApplicationContext
{
    //This class is invoked from program.cs (winform application)
    //Here i have the logic of what form should i start.
    var listeningOn = string.Format("http://*:{0}/", port);
    var appHost = new AppHost();
    appHost.Init();
    appHost.Start(listeningOn);
    ClientService cl = new ClientService((ILayout)f, i);
}

public class ClientService : Service
{
    private readonly ILayout _activeForm;
    private static Init _initConf;


    public ClientService(ILayout f, Init i)
    {
        _activeForm = f;
        _activeForm.GetClientData(i);
        _initConf = i;
    }

    public HttpResult Post(Person request)
    {
       //Here i use _activeForm and _initConf 
    }
}

所以,正如我所说,在 ClientService 类中,我想创建一个构造函数,但是当我向 post 消息发出请求时,它向我显示以下错误:

尝试解析服务“DexBrokerClient.Services.ClientService”或其自动连接依赖项之一时出错

4

2 回答 2

4

ServiceStack 服务是使用构造函数和属性注入自动装配和创建的。任何Constructor 参数都是强制性的,必须在 ServiceStack 的 IOC 中注册AppHost.Configure(),例如:

public override void Configure(Container container)
{
    container.Register<ILayout>(c => ...);
    container.Register<Init>(c => ...);
}

而服务上的任何公共属性都是可选的,如果它们存在或不存在,将从 IOC 填充null

解决服务

服务应在类内部或服务之外的单例中使用base.ResolveService<T>API解析。这从 ServiceStack 的 IOC 中解析了 Service 类,并填充了上下文(如果有的话)。ServiceHostContext.ResolveService<T>()IRequest

于 2016-04-08T20:55:23.893 回答
2

@Mati,@TheMiddleMan @mythz 的答案希望您对 IOC(控制反转)的依赖注入和容器有一些一般性的了解。在您的问题中,您询问构造函数注入。如果您已预先配置(注册)参数对象,ServiceStack 的 IOC 可以使用自动装配来处理它,例如:

container.Register(c => new Layout()); 有关更多示例,请参阅https://docs.servicestack.net/ioc

可以从https://dzone.com/articles/ioc-vs-di阅读有关 IOC 和 DI(依赖注入)的更多信息。

于 2020-05-29T09:03:00.887 回答