带有构造函数

时间:2016-04-08 20:32:16

标签: c# servicestack ioc-container funq

我正在使用Service Stack,但我不能(或者我不知道如何使用构造函数创建一个Service类)。

这是我做的:

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'或其中一个自动连线   依赖

2 个答案:

答案 0 :(得分:3)

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

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

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

解决服务

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

答案 1 :(得分:2)

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

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

有关IOC和DI(依赖注入)的更多信息,请参见https://dzone.com/articles/ioc-vs-di