ServiceStack.Funq.Quartz无法实例化类型?

时间:2016-04-21 23:27:26

标签: servicestack quartz.net funq

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函数,并注释执行内部代码。

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)函数?

1 个答案:

答案 0 :(得分:2)

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

所以,如果我理解正确,在你的情况下,你有:

public class MyServices : Service
{
}

并且您正尝试通过构造函数注入来解析此服务,这有效地执行了:

container.Resolve<MyServices>();

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

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

编辑:可能值得一提的是,您可以注入&#34;非服务&#34;如果你愿意,可以使用你的逻辑课程。您可以解决其他基于ServiceStack.Service的类,即使它们中没有任何内容。

编辑2:回复您的&#34;服务不会处置&#34;问题。这与ServiceStack相同,与Quartz Job无关。如果你打电话给:

container.Resolve<MyServices>().Any(new new ServiceModel.Hello { });
例如,来自AppHost,您的服务不会自行处理。如果你想要它处理你可以将它包装在using语句中。 e.g。

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

使用可确保您的服务随后处理。

或者您可以添加界面&#34; IDispose&#34;在你的Quartz Job上实现一个Dispose()方法,它将执行:

MyServices.Dispose();  

这将在作业执行后调用。