1

ServiceStack.Funq.Quartz 示例代码是

public class MyServices : Service
{
    public object Any(Hello request)
    {
        return new HelloResponse { Result = "Hello, {0}!".Fmt(request.Name) };
    }
}

public class HelloJob : IJob
{
    private MyServices MyServices { get; set; }
    public HelloJob(MyServices myServices)
    {
        MyServices = myServices;
    }
    public void Execute(IJobExecutionContext context)
    {
        var response = MyServices.Any(new ServiceModel.Hello
        {
            Name = "CodeRevver"
        });
        response.PrintDump();
    }
}

以上工作正常。如果我在 MyServices 类中,删除了 Any 函数,并注释Execute内部代码。

public class MyServices : Service
{

}

quartz.net 将收到错误:

[Quartz.Core.ErrorLogger】 An error occurred instantiating job to be executed. job= 'JobGroup1.GetUserJob111' Problem instantiating type 'ServiceStackWithQuartz.HelloJob'

为什么类必须具有公共对象Any(Hello request)功能?

4

1 回答 1

2

感谢您使用该软件包——我不知道其他人会发现它有用。

因此,如果我理解正确,在您的情况下,您有:

public class MyServices : Service
{
}

您正在尝试通过构造函数注入来解决此服务,这实际上是在执行以下操作:

container.Resolve<MyServices>();

由于 ServiceStack Funq IoC 的工作方式,这将失败。您无法解决其中没有任何内容的 ServiceStack 服务(您可能永远也不想这样做)——它必须至少有一个服务实现,不管实现是什么。

此外,如果您想改进 ServiceStack.Funq.Quartz,请随时为代码库做出贡献。

编辑: 可能值得一提的是,如果需要,您可以在其中注入带有逻辑的“非服务”类。即使其中没​​有任何内容,您也可以解析不基于 ServiceStack.Service 的其他类。

编辑 2: 响应您的“服务不会处理”问题。这在 ServiceStack 中是相同的,与您的 Quartz Job 无关。如果你打电话给:

container.Resolve<MyServices>().Any(new new ServiceModel.Hello { });

例如,来自 AppHost 的服务不会自行处理。如果您希望它处理,您可以将其包装在 using 语句中。例如

using (var service = MyServices)
{
    var response = MyServices.Any(new ServiceModel.Hello { });
}

使用确保您的服务将在之后被处理。

或者,您可以将接口“IDispose”添加到您的 Quartz Job 并实现一个 Dispose() 方法,该方法将执行以下操作:

MyServices.Dispose();  

这将在作业执行后调用。

于 2016-04-23T10:26:52.333 回答