【问题标题】:ServiceStack Service class with constructorServiceStack 带有构造函数的服务类
【发布时间】:2016-04-08 20:32:16
【问题描述】:

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

这是我所做的:

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' 或其自动接线之一 依赖关系

【问题讨论】:

    标签: c# servicestack ioc-container funq


    【解决方案1】:

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

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

    鉴于服务上的任何 公共属性 都是可选的,如果它们存在或以其他方式为 null,将从 IOC 填充。

    解析服务

    当在 Service 类或 HostContext.ResolveService&lt;T&gt;() 服务之外的单例中时,应使用 base.ResolveService&lt;T&gt; API 解析服务。这会从 ServiceStack 的 IOC 解析 Service 类,并使用 IRequest 上下文(如果有)填充。

    【讨论】:

    • 谢谢,我仍然不明白如何解决这个问题。在“上下文”类中,我正在创建表单和初始化(类)的实例,另外,我创建了ClientService,我将参数发送给构造函数..
    • @MatiSilver 我不知道您要做什么或为什么要为此使用服务类?当 AppHost 初始化并且需要从 IOC 解析时,服务会预先自动装配,如果您使用的是非默认构造函数,则每个参数都需要在 IOC 中注册。您不应该直接创建 Service 类,这是 ServiceStack 在执行 Service 时自行执行的操作。您可以从 IOC 解析 Service 类以创建它的实例,但它需要在 IOC 中注册其强制 deps,如果您不想这样做,请不要使用 Service 类。
    • 好的,让我们做的更简单。在我的 Context 类中,我将创建一个需要在 Service 类中使用的对象。 (我改变了我的架构,所以现在我没有带参数的构造函数),但我仍然需要使用我在其他类中初始化的对象。我应该如何使用我在一个类中创建的对象,进入服务等级?谢谢
    • 一个更完整的答案会很棒。您实际上并没有解释要做什么。来自直到今天从未使用过服务堆栈的人,这个答案并没有给我任何东西。 (c =&gt; ...) 中有什么内容?
    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-12
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-05
      • 1970-01-01
      相关资源
      最近更新 更多